【问题标题】:Return arraylist populated inside Callback返回在回调中填充的数组列表
【发布时间】:2017-01-23 12:18:55
【问题描述】:

我正在尝试使用已在回调中填充的推文数组列表,但我不知道如何返回构建的列表。每当我尝试使用构建列表时,它都是空的。

我从这个post得到了一些代码

public  ArrayList<Tweet> tweetList() { 
   final ArrayList<Tweet> tweets = new ArrayList<>();
   final UserTimeline userTimeline = new UserTimeline.Builder()
           .screenName("xxxxxxxx")
           .build();
   userTimeline.next(null, new Callback<TimelineResult<Tweet>>() {
       @Override
       public void success(Result<TimelineResult<Tweet>> result) {
           for(Tweet tweet : result.data.items){
               tweets.add(tweet);
           }
           Log.d("Finished Tweet List", String.valueOf(tweets));
           //  when this is printed I can see the ArrayList and all tweets are there
       }
       @Override
       public void failure(TwitterException exception) {
           exception.printStackTrace();
       }
   });
   Log.d("Tweet list returned", String.valueOf(tweets));
   // the value of tweets is empty here for some reason

   return tweets;
}

【问题讨论】:

  • 由于信息是通过回调返回的,我猜该方法是异步的。如果是这种情况,那么您的方法将启动另一个线程以访问互联网并在触发该回调之前返回。把你想做的工作放在回调里面,确保信息正确传递。

标签: java android arraylist twitter


【解决方案1】:

除了返回Tweets 的空ArrayList,您可以修改您的方法,以便在Callback 的响应成功时更新Tweets 的另一个ArrayList

所以我建议修改你的方法如下:

private ArrayList<Tweet> tweetList = new ArrayList<>();

public void tweetList() { 
   final ArrayList<Tweet> tweets = new ArrayList<>();
   final UserTimeline userTimeline = new UserTimeline.Builder()
           .screenName("xxxxxxxx")
           .build();
   userTimeline.next(null, new Callback<TimelineResult<Tweet>>() {
       @Override
       public void success(Result<TimelineResult<Tweet>> result) {
           for(Tweet tweet : result.data.items){
               tweets.add(tweet);
           }

           this.tweetList = tweets;

           // execute the next sequence of instructions in your program here
           // and make use of tweetList instead of tweets

       }

       @Override
       public void failure(TwitterException exception) {
           exception.printStackTrace();
       }
   });
}

【讨论】:

    【解决方案2】:

    当然,这里 tweets 的值是空的! 函数userTimeline.next(null, new Callback&lt;TimelineResult&lt;Tweet&gt;&gt;()不在主线程上执行(它是一个异步任务)。 所以return tweets 在你的ArrayList&lt;Tweets&gt; tweets 被填充之前被调用。

    你只能在你的列表中做操作

    @Override
    public void success(Result<TimelineResult<Tweet>> result) {
       //do whatever with your list here !
    }
    

    希望我已经清楚了!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-12-04
      • 2017-10-26
      • 1970-01-01
      • 2021-01-24
      • 2018-06-04
      相关资源
      最近更新 更多