Search code examples
androidjtwitter

Alternative for getPublicTimeline for jtwitter


Edit===========

Pasted from MANIFEST.MF file:

Main-Class: winterwell.jtwitter.Twitter
Implementation-Version: 2.9.0
Implementation-Title: JTwitter client library by Winterwell


Android Studio 0.2.9
jtwitter 2.9.0

Hello,

I have been following the marakana videos on creating a yamba client.

However, I have noticed that the getPublicTimeline api call has now been removed from the jtwitter as twitter no longer supports this. So I have tired to use an alternative instead but getting a error which I have cut and pasted below.

The different API I have tried is getFriendsTimeline, getHomeTimeline.

My code snippet I am using:

@Override
protected void onCreate(Bundle savedInstanceState) 
{
    super.onCreate(savedInstanceState);
    setContentView(R.layout.status);

    edit_status = (EditText)findViewById(R.id.editText);
    tw = new Twitter("student", "password");
    tw.setAPIRootUrl("http://yamba.marakana.com/api");
}

public class GetHomeStatus extends AsyncTask<String, Integer, String>
{
    @Override
    protected String doInBackground(String... statues)
    {
        int i = 0;
        List<winterwell.jtwitter.Status> timeline;

        try {
            timeline = twitter.getFriendsTimeline();
            //twitter.setStatus("Hello, there!");
        }
        catch (TwitterException e) {
            e.printStackTrace();
            return "Failed to get timeline";
        }

I don't think there is a problem with the background thread, as twitter.setStatus("Hello, there!"); works fine.

Many suggestions would be most grateful

Exception:

 275-445/system_process W/InputMethodManagerService﹕ Window already focused, ignoring focus gain of: com.android.internal.view.IInputMethodClient$Stub$Proxy@4193edb0 attribute=null, token = android.os.BinderProxy@4177e720
09-11 03:58:37.108    3187-3204/com.sunsystems.yambaapp W/System.err﹕ winterwell.jtwitter.TwitterException: 301 Moved Permanently
09-11 03:58:37.108    3187-3204/com.sunsystems.yambaapp W/System.err﹕ HTTP/1.1 301 Moved Permanently https://marakana.com/s/tags/breaking_open/?include_entities=1& -> https://marakana.com/s/tags/breaking_open/?include_entities=1&
09-11 03:58:37.118    3187-3204/com.sunsystems.yambaapp W/System.err﹕ at winterwell.jtwitter.URLConnectionHttpClient.processError(URLConnectionHttpClient.java:513)
09-11 03:58:37.118    3187-3204/com.sunsystems.yambaapp W/System.err﹕ at winterwell.jtwitter.URLConnectionHttpClient.connect(URLConnectionHttpClient.java:155)
09-11 03:58:37.118    3187-3204/com.sunsystems.yambaapp W/System.err﹕ at winterwell.jtwitter.URLConnectionHttpClient.getPage2(URLConnectionHttpClient.java:311)
09-11 03:58:37.118    3187-3204/com.sunsystems.yambaapp W/System.err﹕ at winterwell.jtwitter.URLConnectionHttpClient.getPage(URLConnectionHttpClient.java:251)
09-11 03:58:37.118    3187-3204/com.sunsystems.yambaapp W/System.err﹕ at winterwell.jtwitter.Twitter.getStatuses(Twitter.java:1660)
09-11 03:58:37.118    3187-3204/com.sunsystems.yambaapp W/System.err﹕ at winterwell.jtwitter.Twitter.getHomeTimeline(Twitter.java:1162)
09-11 03:58:37.118    3187-3204/com.sunsystems.yambaapp W/System.err﹕ at winterwell.jtwitter.Twitter.getFriendsTimeline(Twitter.java:1153)
09-11 03:58:37.118    3187-3204/com.sunsystems.yambaapp W/System.err﹕ at com.sunsystems.yambaapp.UpdateService$GetHomeStatus.doInBackground(UpdateService.java:70)
09-11 03:58:37.118    3187-3204/com.sunsystems.yambaapp W/System.err﹕ at com.sunsystems.yambaapp.UpdateService$GetHomeStatus.doInBackground(UpdateService.java:61)
09-11 03:58:37.128    3187-3204/com.sunsystems.yambaapp W/System.err﹕ at android.os.AsyncTask$2.call(AsyncTask.java:287)
09-11 03:58:37.128    3187-3204/com.sunsystems.yambaapp W/System.err﹕ at java.util.concurrent.FutureTask.run(FutureTask.java:234)
09-11 03:58:37.128    3187-3204/com.sunsystems.yambaapp W/System.err﹕ at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:230)
09-11 03:58:37.128    3187-3204/com.sunsystems.yambaapp W/System.err﹕ at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1080)
09-11 03:58:37.128    3187-3204/com.sunsystems.yambaapp W/System.err﹕ at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:573)
09-11 03:58:37.128    3187-3204/com.sunsystems.yambaapp W/System.err﹕ at java.lang.Thread.run(Thread.java:841)

Solution

  • I was able to reproduce the said exception using JTwitter 2.9.0. Reason for my earlier suggestion was:

    List<winterwell.jtwitter.Status> timeline;
    

    I was using a modified version of JTwitter library: JTwitterYamba. This library does not contain winterwell.jtwitter.Status. Instead Status is an inner class defined in winterwell.jtwitter.Twitter making its fully qualified path: winterwell.jtwitter.Twitter.Status.

    List<winterwell.jtwitter.Twitter.Status> timeline;
    

    So, instead of asking you to lose JTwitter jar and add JTwitterYamba jar, I suggested the exact opposite. Sorry about the confusion.

    The problem:

    Both libraries implement Twitter.getFriendsTimeline() differently. Here's what JTwitterYamba does:

    public List<Status> getFriendsTimeline() throws TwitterException {
    
        // Take note of the URL suffix: /statuses/friends_timeline.json
        return getStatuses(TWITTER_URL + "/statuses/friends_timeline.json",
            standardishParameters(), true);
    }
    

    And, here's what JTwitter does:

    @Deprecated
    public List<Status> getFriendsTimeline() throws TwitterException {
        return getHomeTimeline();
    }
    
    
    public List<Status> getHomeTimeline() throws TwitterException {
        assert http.canAuthenticate();
    
        // The URL isn't the same
        return getStatuses(TWITTER_URL + "/statuses/home_timeline.json",
                             standardishParameters(), true);
    }
    

    What you can do to fix this:

    You can remove JTwitter from your project and add JTwitterYamba jar: Link. You will have to change winterwell.jtwitter.Status to winterwell.jtwitter.Twitter.Status.

    Alternatively, you can check if modifying the library is allowed and possible for you. Add a public method that uses TWITTER_URL + "/statuses/friends_timeline.json" as one of the arguments for Twitter.getStatuses method.