2016-10-03 40 views
0

我試圖從API獲取一些數據返回null,但我總是在異步任務越來越空。這是我的AsyncTask:的AsyncTask與對象的ArrayList的結果在OnPostExecute

private class DownloadTask extends AsyncTask<Bundle, Void, List<Topic>> { 

    @Override 
    protected void onPreExecute() { 
     HomeActivity.mProgressBar.setVisibility(View.VISIBLE); 
     HomeActivity.mProgressBar.setIndeterminate(true); 
    } 

    @Override 
    protected List<Topic> doInBackground(Bundle... params) { 
     return downloadPhotos(params[0]); 
    } 

    @Override 
    protected void onPostExecute(List<Topic> topics) { 
     HomeActivity.mProgressBar.setVisibility(View.INVISIBLE); 
     HomeActivity.mProgressBar.setIndeterminate(false); 

     Log.d("List Size: ", ""+topics); // 0 

     adapter = new TopicListAdapter(activity, topics); 
     RecyclerView.LayoutManager manager = new MyCustomLayoutManager(activity); 
     recyclerView.setLayoutManager(manager); 
     recyclerView.setItemAnimator(new DefaultItemAnimator()); 
     recyclerView.setAdapter(adapter); 
    } 
} 

用於檢索數據應該兩個數組合併成一個數組,因爲我是從兩個地方獲取數據的方法:

private List<Topic> downloadPhotos(Bundle params) { 
    String profileId = activity.getPreferencesManager().getProfileId(); 
    List<Topic> topicsFromMe, topicsFromFriends; 
    topicsFromFriends = setValuesFromFriends(params); 
    topicsFromMe = setValuesFromMe(profileId, params); 
    topicsFromFriends.addAll(topicsFromMe); 
    sortTopics(topicsFromFriends); 
    int k = topicsFromFriends.size(); 
    Log.d("List Size: ", "" + topicsFromFriends); // here also 0 for size 
    if (k > 10) 
     topicsFromFriends.subList(10, k).clear(); 
    return topicsFromFriends; 
} 

這裏是一個方法,其中我設置值到數組列表。很奇怪,在這種情況下,RecyclerView是用這個數組填充的,但我沒有得到我想要的結果。例如,我應該對這個列表進行排序,並只顯示10條記錄。

private List<Topic> setValuesFromFriends(final Bundle params) { 
    final List<Topic> topics = new ArrayList<>(); 
    activity.getSimpleFacebook().getFriends(new OnFriendsListener() { 
     @Override 
     public void onComplete(List<Profile> friends) { 
      for (final Profile profile : friends) { 
       activity.getSimpleFacebook().get(profile.getId(), "photos/uploaded", params, 
         new OnActionListener<List<Photo>>() { 
          @Override 
          public void onComplete(List<Photo> photos) { 
           for (final Photo photo : photos) { 
            // Initialize instance of Topic 
            final User user = photo.getFrom(); 
            final Topic topic = new Topic(); 

            topic.setCaption(photo.getName()); 
            topic.setImageId(photo.getId()); 
            topic.setCreatedTime(photo.getCreatedTime()); 
            topic.setPostImage(photo.getSource()); 
            topic.setUserId(user.getId()); 
            topic.setName(user.getName()); 

            final Bundle likeParams = new Bundle(); 
            likeParams.putString("fields", "total_count"); 
            likeParams.putString("limit", "100000"); 

            activity.getSimpleFacebook().get(photo.getId(), "likes", 
              likeParams, new OnActionListener<List<Like>>() { 
               @Override 
               public void onComplete(List<Like> likes) { 
                topic.setNumOfLikes(likes.size()); 
                topics.add(topic); 
               } 

               @Override 
               public void onThinking() { 
                super.onThinking(); 
               } 
              }); 

           } 
          } 
         }); 
      } 
     } 
    }); 
    return topics; 
} 

回答

1

您錯誤地使用了AsyncTask。

的AsyncTask推出,其中在那裏執行該方法,doenloadPhotos另一個線程(線程1)。此方法正在調用setValuesFromFriends,該方法使用方法getFriends創建另一個線程(線程2)。當thread2已經啓動時,setValuesFromFriends中的其餘代碼將被執行。

所以這裏是它是如何工作的:

private List<Topic> setValuesFromFriends(final Bundle params) { 
    final List<Topic> topics = new ArrayList<>(); 
    //launched process on new thread 
    return topics; //this is 0 as topics = new ArrayList<>(); 
} 

所以現在topicsFromFriends = 0。因此,你所得到的輸出= 0

有效線程1是越來越執行之前線程2完成。由於線程1的輸出爲0,沒有顯示在UI後onPostExecute

沒有必要使用的AsyncTask的。 您應該將所有必需的代碼放在new OnFriendsListener()onComplete之內。這樣信息將正確顯示。您可以在setValuesFromFriends之前啓動進度條,然後在onComplete中將其刪除。