Java 如何从在doInBackground中进行另一个异步调用的AsyncTask返回值
我有一个异步任务,用于向youtube API发出请求。我试图从AsyncTask返回数据,但在我执行youtube请求时,数据立即冻结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) {
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()中处理。