无法从改装响应中返回对象列表

时间:2017-03-04 10:47:03

标签: java android arraylist retrofit retrofit2

我正在使用改造库来为我的应用程序执行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]。我只是想拍电影,然后将其作为列表返回

3 个答案:

答案 0 :(得分: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;

}

还要记得检查您的回复是否成功。

答案 1 :(得分:0)

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

        var xmlDoc = new XmlDocument();
        xmlDoc.LoadXml(xml);

        var dups = xmlDoc.FirstChild.ChildNodes
            .Cast<XmlNode>()
            .Where(n=>n.Attributes.Count>0)
            .GroupBy(n => n.Attributes["EmailID"].Value)
            .Where(g => g.Count() > 1)
            .SelectMany(g => g.ToList())
            .ToList();

答案 2 :(得分: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.
         }

  }