Java 更新2-列表最终为空,即使在填充之后也是如此。

Java 更新2-列表最终为空,即使在填充之后也是如此。,java,android,rest,logic,retrofit2,Java,Android,Rest,Logic,Retrofit2,问题是全局变量“responseDogs”在方法末尾返回为null,但在onResponse方法!中填充 代码: 公共类狗架{ 私人名单; //... 公共列表retrieveDogsFromREST(){ 最终DogService DogService=DogService.serviceDog; dogService.getDogs(AuthRequest.createAuthJsonString()).enqueue(新回调(){ @凌驾 公共void onResponse(调用、响应){

问题是全局变量“responseDogs”在方法末尾返回为null,但在onResponse方法!中填充

代码:

公共类狗架{
私人名单;
//...
公共列表retrieveDogsFromREST(){
最终DogService DogService=DogService.serviceDog;
dogService.getDogs(AuthRequest.createAuthJsonString()).enqueue(新回调(){
@凌驾
公共void onResponse(调用、响应){
if(response.issusccessful()){
responseDogs=response.body().getDogs();
Log.d(“DogRESTSuccessful”,“+response.body().getDogs());
Log.d(“接收到的狗->”,“+响应的狗”);
}否则{
Log.d(“dogrestnssuccessful”,“-statusCode”+response.code());
}
}
@凌驾
失败时公共无效(调用调用,可丢弃的t){
//...
}
});
Log.d(“onRetrieveDR”,即“+responseDogs”);
返回应答器;
}
}
注意->>“Log.d(“DogRESTSuccessful”、“+response.body().getDogs()”)和“Log.d(“dogsReceived->”、“+responseDogs”)显示填充的响应日志

但是retrieveDogsFromREST正在返回空列表,“Log.d”(“onRetrieveDR”,“+responseDogs”)也是如此


也许我写错了逻辑?IDK

您确定您收到的响应主体与模型类中的结构完全相同吗?您的JSON是否可以有一个更高级别的对象来包装您的
responseDogs
列表?我这样问是因为如果没有提供JSON响应样本,很难对这个案例进行假设

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

我给您的建议是,在调用onResponse后,发出一个,通知系统并触发一个事件,更新需要更新的视图


通常情况下,人们最终会执行类似以下操作

用response.body()填充一个列表,然后返回它,这样我就可以得到结果并在以后使用它。主要问题是该方法返回的是一个空列表,但如果在onResponse()中填充了它,这怎么可能呢?所以,我将尝试在AsyncTask类的doInBackground中调用service.execute(…),然后使用onPostExecute更新视图。它可能真的可以工作。像在这个例子()中一样使用rxandroid2,并且工作得非常好!谢谢你的提醒!
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;
}
}