2017-03-04 15 views
-1

私はretrofitライブラリを使用して私のアプリケーションのAPI呼び出しを行っています。 APIのための別の関数を書いて、再利用できるようにしました。私が戻ってくる応答は、オブジェクト '映画'のリストです。しかし、私はオブジェクトを返すことができません。私はここで何をすべきですか?改造応答からオブジェクトのリストを返すことができません

APIからデータを取得する機能が

// These are the retrofit codes to get the data from TMDB API 
    private List<Movies> getDataFromServer(int page) 
{ 
    ApiInterface apiService = ApiClient.getClient().create(ApiInterface.class); 

    Call<Response> call = apiService.getPopularMovies(API_KEY , page); 

    List<Movies> movies = new ArrayList<>(); 

    call.enqueue(new Callback<Response>() { 
     @Override 
     public void onResponse(Call<Response> call, retrofit2.Response<Response> response) { 
      movies = response.body().getMovies(); 
     } 

     @Override 
     public void onFailure(Call<Response> call, Throwable t) { 
      Log.e(TAG,t.toString()); 
      movies = null; 
     } 
    }); 
    return movies; 

} 

それは私が最終的として映画を宣言する必要がありますが、私が行うとき、それは自動的に配列に配列リストと内部の動画を変換することを言いますonResponseとonFailureはmoviess [0]に変わります。

private List<Movies> getDataFromServer(int page) 
{ 
     ApiInterface apiService = ApiClient.getClient().create(ApiInterface.class); 

    Call<Response> call = apiService.getPopularMovies(API_KEY , page); 


    call.enqueue(new Callback<Response>() { 
     @Override 
     public void onResponse(Call<Response> call, retrofit2.Response<Response> response) { 
      if (response.isSuccessful()) { 
      movies = response.body().getMovies(); } 
      else{ 
      //show error 
      } 

     } 

     @Override 
     public void onFailure(Call<Response> call, Throwable t) { 
      Log.e(TAG,t.toString()); 
      movies = null; 
     } 
    }); 
    return movies; 

} 

がいることを確認することを忘れないでください:私はちょうど映画を取得し、リストとしてそれを返す

+0

'movie' listviewは、コールバックメソッドである' onResponse'にデータを設定しているので、常に空です。 –

+0

インターフェイスを作成し、ムービーを取得する場所に実装します。 –

答えて

0

あなたはあなたのクラスのフィールドとしてムービーのリストを宣言することができますし、このような何かを書きたいですあなたの応答は成功です。

0

あなたはアンドロイドスタジオの機能を使って最終的にモディファイアを変更していると思いますが、あなたが望むように動作せず、別のスレッドでデータをフェッチしてnullを返すだけなので、あなたが取得したデータは、その後、あなたがそれを望む今まで何をするときの問題は、あなたがコールバックメソッドであるonResponseから呼び出していると、データをロードしてくるには時間がかかるだろうし、ということである

//declare movies as a class field 
List<Movies> movies; 
... 
private List<Movies> getDataFromServer(int page) 
{ 
... 
call.enqueue(new Callback<Response>() { 
    @Override 
    public void onResponse(Call<Response> call, retrofit2.Response<Response> response) { 
     dataIsReady(response.body().getMovies(); 
    } 

    @Override 
    public void onFailure(Call<Response> call, Throwable t) { 
     Log.e(TAG,t.toString()); 
     movies = null; 
    } 
}); 
} 

private void dataIsReady(List<Movies> movies){ 
    this.movies = movies; 
    //do what you want with movies 
} 
0

呼び出すメソッドを宣言することができますあなたの映画リストにそれらを読み込んでください。あなたは応答が受信者になることを決して知らないでしょう。したがって、リターンを取ることは良い考えではありません。あなたはonResponse()の中から何をしていても続けるべきです。

@Override 
    public void onResponse(Call<Response> call, retrofit2.Response<Response> response) { 
     if (response.isSuccessful()) { 
     movies = response.body().getMovies(); 
//continue whatever you want do from here when the response is received. 
     } 

    } 
+0

これは私が最初にしたものです。しかし、このように、無限のスクロールリサイクラービューを実装するのは難しいので、リストを返すともっと簡単になると決めました。 –

+0

次に、受信したリストを受信時に返信するonResponseにリスナーを追加する必要があります –

関連する問題