Retrofit2 - 即使在填充后,列表也会以null结尾。

时间:2018-01-09 14:38:40

标签: java android rest logic retrofit2

问题在于全局变量" responseDogs"在方法结束时返回为null,但是在onResponse方法中填充!?

代码:

public class DogREST {


private List<Dog> responseDogs;

//...


public List<Dog> retrieveDogsFromREST() {


    final DogService dogService = DogService.serviceDog;


    dogService.getDogs(AuthRequest.createAuthJsonString()).enqueue(new Callback<DogList>() {
        @Override
        public void onResponse(Call<DogList> call, Response<DogList> response) {

            if (response.isSuccessful()) {

                responseDogs = response.body().getDogs();


                Log.d("DogRESTSuccessful", "" + response.body().getDogs());
                Log.d("dogsReceived - >", "" + responseDogs);


            } else {

                Log.d("DogRESTNSuccessful", "- statusCode" + response.code());

            }

        }


        @Override
        public void onFailure(Call<DogList> call, Throwable t) {

            //...

        }


    });


    Log.d("onRetrieveDR", ""+ responseDogs);
    return reponseDogs;
}
}

注意 - &gt;&gt; &#34; Log.d(&#34; DogRESTSuccessful&#34;,&#34;&#34; + response.body()。getDogs())&#34;和#34; Log.d(&#34; dogsReceived - &gt;&#34;,&#34;&#34; + responseDogs)&#34;显示填充的responseDogs ......

但retrieveDogsFromREST返回空列表,&#34; Log.d(&#34; onRetrieveDR&#34;,&#34;&#34; + responseDogs)&#34;

也许我写错了逻辑? IDK

2 个答案:

答案 0 :(得分:2)

你的逻辑中有一个简单的误解。发出请求的线程是异步,这意味着它最终将在您的应用程序运行时执行。即使您的请求很快,它也总是返回null,因为线程没有时间更新它。

我的建议是,一旦 onResponse 被调用 通知 Observer pattern 系统并触发更新您需要更新的视图的事件。

通常人们最终会做这样的事情post

答案 1 :(得分:-1)

您确定您收到的响应正文与模型类中的结构完全相同吗?您的JSON可以有一个包含responseDogs列表的高级对象吗?我问这是因为在没有提供JSON响应样本的情况下很难想到这个案例。