2017-03-04 73 views
-1

我正在使用改進庫爲我的應用程序執行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]。我只是想獲得的電影,然後返回它作爲一個List

+0

'movies' listview始終保持爲空,因爲您正在將數據設置爲作爲回調方法的'onResponse'。 –

+0

創建一個界面,並在想要獲取電影的位置實施它。 –

回答

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

我認爲你正在使用android studio的功能來修改最終的修改器,但它不會如你所願並改變電影修改器ti最終不會修復你的問題,因爲你在另一個線程中獲取數據,而你只是返回null。你可以聲明一個方法調用,當你獲取數據,那麼你想用它什麼都

//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呼籲這是一個回調方法,將需要時間來加載數據和來將它們加載到您的電影列表中。您永遠不會知道響應何時會被接收,因此獲取回報並不是一個好主意。您應該繼續從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添加一個偵聽器,該偵聽器在收到收到的列表時收到它 –