我有一个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
}
}