【问题标题】:Not able to return a list of objects from retrofit response无法从改造响应中返回对象列表
【发布时间】:2017-03-04 10:47:02
【问题描述】:

我正在使用改造库为我的应用执行 API 调用。我为 API 编写了一个单独的函数,以便它可以重用。我得到的响应是对象 'Movies' 的列表。但我无法返回对象。我应该在这里做什么?

从 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;

}

它说我应该将电影声明为 final,但是当我这样做时,它会自动将数组列表转换为数组,并将 onResponse 和 onFailure 中的电影转换为 moviess[0]。我只想获取电影,然后将其作为列表返回

【问题讨论】:

  • movies listview 始终为空,因为您在 onResponse 上设置数据,这是回调方法。
  • 创建一个接口并在你想要获取电影的地方实现它。

标签: java android arraylist retrofit retrofit2


【解决方案1】:

您可以将您的电影列表声明为您的类中的一个字段,然后编写如下内容:

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;

}

还记得检查您的响应是否成功。

【讨论】:

    【解决方案2】:

    问题是你是从 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.
             }
    
      }
    

    【讨论】:

    • 是的,这就是我最初所做的。但是通过这种方式,我很难实现无限滚动回收视图,所以我决定如果我返回列表会更容易。
    • 那么你应该在你的 onResponse 中添加一个监听器,在收到列表时将它发回
    【解决方案3】:

    我认为您正在使用 android studio 的功能将修饰符更改为 final,但它不能按您的意愿工作,并且更改电影修饰符 ti final 不会解决您的问题,因为您在另一个线程中获取数据并且您只是返回 null.you可以在获取数据时声明一个要调用的方法,然后用它做任何你想做的事情

    //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
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-02-24
      • 2021-12-09
      • 2020-03-06
      • 2017-01-15
      • 2019-06-20
      • 1970-01-01
      • 1970-01-01
      • 2020-12-07
      相关资源
      最近更新 更多