如何从在doInBackground中进行另一个异步调用的AsyncTask返回值



我有一个asyncTask,用于向youtube API发出请求。我正在尝试从AsyncTask返回数据,但是一旦我执行YouTube请求,它就会冻结

public class FindPreviousPlaylistTask extends AsyncTask<Void, Void, PlaylistListResponse> {
    @Override
    protected PlaylistListResponse  doInBackground(Void... params) {
            YouTube.Playlists.List playlistsListMineRequest = getYoutube().playlists()
                    .list("snippet,contentDetails")
                    .setMine(true)
                    .setMaxResults(50L);
            ArrayList<Playlist> foundPlaylists = new ArrayList<Playlist>();
            PlaylistListResponse response = playlistsListMineRequest.execute(); //Async call
            return response;
        return null;
    }
}

.

private PlaylistListResponse getPlaylist(){
   FindPreviousPlaylistTask previousPlaylistTask = new FindPreviousPlaylistTask();
   return previousPlaylistTask.execute().get();
}

AsyncTask的全部意义是在主线程之外进行YouTube调用,但现在我无法返回youtube调用的值。

如果我在没有.get()的情况下打电话给previousPlaylistTask.execute(),它工作正常

你返回的结果将在 onPostExecute(( 方法中可用,或者你可以创建一个这样的接口

 public class FindPreviousPlaylistTask extends AsyncTask<Void, Void, 
  PlaylistListResponse> {
   public interface AsyncResponse {
         void processFinish(PlaylistListResponse output);
      }
  public AsyncResponse delegate = null;
   public FindPreviousPlaylistTask (AsyncResponse delegate){
    this.delegate = delegate;
    }
    @Override
    protected PlaylistListResponse  doInBackground(Void... params) {
        YouTube.Playlists.List playlistsListMineRequest = 
     getYoutube().playlists()
                .list("snippet,contentDetails")
                .setMine(true)
                .setMaxResults(50L);
        ArrayList<Playlist> foundPlaylists = new ArrayList<Playlist>();
        PlaylistListResponse response = playlistsListMineRequest.execute(); 
     //Async call
        return response;
     return null;
 }
 @Override
 protected void onPostExecute(PlaylistListResponse result) {
    delegate.processFinish(result);
  }
}

你可以这样称呼它

private void getPlaylist(){
  FindPreviousPlaylistTask previousPlaylistTask=new 
    FindPreviousPlaylistTask( new AsyncResponse(){
    @Override
    void processFinish(PlaylistListResponse output){
        //here your AsyncTask response will be available in output valiable
        //you can do whatever you want here
     }
  }).execute();
}

您的应用程序冻结,因为您正在调用get()这使得当前线程等待任务完成并获取结果。您应该改用 onPostExecure(PlaylistListResponse result) 中给出的结果。

public class FindPreviousPlaylistTask extends AsyncTask<Void, Void, PlaylistListResponse> {
    @Override
    protected PlaylistListResponse  doInBackground(Void... params) {
            YouTube.Playlists.List playlistsListMineRequest = getYoutube().playlists()
                    .list("snippet,contentDetails")
                    .setMine(true)
                    .setMaxResults(50L);
            ArrayList<Playlist> foundPlaylists = new ArrayList<Playlist>();
            PlaylistListResponse response = playlistsListMineRequest.execute(); //Async call
            return response;
        return null;
    }
    @Override
    protected void onPostExecute(PlaylistListResponse result) {
        // Do something with your result
    }
}

相关内容

最新更新