2017-11-11 8 views
0

私はyoutube APIにリクエストするためのasyncTaskを持っています。私はAsyncTaskからデータを返そうとしていますが、YouTubeリクエストを実行するとすぐにフリーズします。別の非同期呼び出しをdoInBackgroundで行うAsyncTaskから値を返す方法

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

'返信応答;'。いいえ、 '出力'は含まれません。 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 
    } 

} 
関連する問題