2017-11-11 8 views
0

YouTube API에 요청하기위한 asyncTask가 있습니다. AsyncTask에서 데이터를 반환하려고하는데 youtube 요청을 실행하자마자 멈 춥니 다.AsyncTask에서 doInBackground에서 다른 비동기 호출을 발생시키는 값을 반환하는 방법

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를의 요점은 메인 스레드 외부에서 유튜브 전화를하지만, 지금은 유튜브 호출의 값을 반환 할 수 있습니다. 내가 .get()없이 previousPlaylistTask.execute()를 호출 할 경우

은 당신이 완료하고 결과를 얻을 수있는 작업에 대한 현재 스레드를 대기하게 get()를 호출하기 때문에 앱이 정지

+0

같은 사용자 정의 리스너를 호출 할 수 있습니다이

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); } } 

같은 인터페이스를 만들 수 있습니다 ' –

+0

@ ρяσѕρєяK 무슨 뜻인지 확실치 않습니다. – code511788465541441

+0

예제 : [사용자 지정 리스너 만들기] (https://guides.codepath.com/android/Creating-Custom-Listeners) –

답변

2

당신은 결과 onPostExecute() 메소드로 제공됩니다 돌아가거나 당신이`인터페이스를 사용하여 생성이

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(); 

} 
+0

'return response;'. 아니 그 '출력'을 포함하지 않습니다. doInBackground가 시작되기 전에 함수가 초기화되지 않은 응답으로 반환됩니다. – greenapps

+0

출력은 processFinish()에서 처리되어야합니다. – greenapps

+0

맞습니다. 지금 내 대답을 편집 중입니다. @greenapps –

2

잘 작동합니다. 대신 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 
    } 

}