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

Java 如何从在doInBackground中进行另一个异步调用的AsyncTask返回值,java,android,android-asynctask,Java,Android,Android Asynctask,我有一个异步任务,用于向youtube API发出请求。我试图从AsyncTask返回数据,但在我执行youtube请求时,数据立即冻结 public class FindPreviousPlaylistTask extends AsyncTask<Void, Void, PlaylistListResponse> { @Override protected PlaylistListResponse doInBackground(Void... params) {

我有一个异步任务,用于向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;
    }

}
AsyncTask的全部要点是在主线程之外进行youtube调用,但现在我无法返回youtube调用的值


如果我调用
previousplaytask.execute()
而不调用
.get()
它工作正常

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

公共类FindPreviousPlaylTask扩展了AsyncTask{
@凌驾
受保护的播放列表响应doInBackground(无效…参数){
YouTube.Playlists.List playlistMinerRequest=getYoutube().Playlists()
.list(“代码段、内容详细信息”)
.setMine(真)
.setMaxResults(50L);
ArrayList foundPlaylists=新建ArrayList();
playlistresponse response=playlistminerequest.execute();//异步调用
返回响应;
返回null;
}
@凌驾
受保护的void onPostExecute(播放列表响应结果){
//对你的结果做点什么
}
}

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

公共类FindPreviousPlaylTask扩展了AsyncTask{
@凌驾
受保护的播放列表响应doInBackground(无效…参数){
YouTube.Playlists.List playlistMinerRequest=getYoutube().Playlists()
.list(“代码段、内容详细信息”)
.setMine(真)
.setMaxResults(50L);
ArrayList foundPlaylists=新建ArrayList();
playlistresponse response=playlistminerequest.execute();//异步调用
返回响应;
返回null;
}
@凌驾
受保护的void onPostExecute(播放列表响应结果){
//对你的结果做点什么
}
}

返回的结果将在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();

}

返回的结果将在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();

}

使用
接口创建自定义监听器
@ρцσρѕρєK不确定您的意思。你能给我举个简单的例子吗:使用
接口创建自定义监听器
@ρц∑ρєK不知道你的意思。你能给我举个简单的例子吗:
returnresponse。不包含“输出”的。在doInBackground启动之前,您的函数将返回未初始化的响应。输出应在processFinish()中处理。
return response。不包含“输出”的。在doInBackground启动之前,函数将返回未初始化的响应。输出应在processFinish()中处理。