为什么我不能在onResponse中设置变量?

时间:2018-01-12 12:44:03

标签: java android rest retrofit2

最近我开始使用改装,我很难尝试了解它是如何工作的。

我试图将一个在onResponse()中初始化的变量传递给另一个稍后使用它的方法。

以下代码是我想到的尝试解决方案的方式,但后来我意识到方法loadList返回了一个空的ItemList。

问题1)我想知道为什么会发生这种情况,我是否遗漏了一些关于java的知识,或者这种方法不是最佳解决方案?

另外,我注意到如果我想在onResponse中使用list的值,我可以使用response.body()

的值。
public ItemList loadList()

    Call<ItemList> call = retrofitInit().loadList();

    call.enqueue(new Callback<ItemList>() {
        @Override
        public void onResponse(Call<ItemList> call, Response<ItemList> response) {
            list = response.body();
            System.out.println(item.getItem().get(0).getName());
        }

        @Override
        public void onFailure(Call<ItemList> call, Throwable t) {
            System.out.println("FAILURE" + t.toString());
        }
    });

  return list; 

}

**更新:**

private RestClient retrofitInit() {

    Retrofit retrofit = new Retrofit.Builder()
            .baseUrl("http://192.168.0.49/Android/")
            .addConverterFactory(GsonConverterFactory.create())
            .build();

    return retrofit.create(RestClient.class);
}

问题2)有没有人有更好的解决方案呢?我见过很多人使用RxJava但我真的不想进入它。

感谢您的所有评论,谢谢!

2 个答案:

答案 0 :(得分:2)

这是因为onResponse是一个在不同线程上运行的异步方法。

可以使用界面完成解决方案。

1 - 定义界面

public interface OnDataLoaded {

 onDataLoaded(ItemList itemlist);

}

2 - 将接口作为方法参数传递

public ItemList loadList(OnDataLoaded onDataLoaded)

3 - 使用界面传递列表。

public ItemList loadList(OnDataLoaded onDataLoaded){

Call<ItemList> call = retrofitInit().loadList();

call.enqueue(new Callback<ItemList>() {
    @Override
    public void onResponse(Call<ItemList> call, Response<ItemList> response) {

        list = response.body();
       onDataLoaded.onDataLoaded(list);
        System.out.println(item.getItem().get(0).getName());
    }

    @Override
    public void onFailure(Call<ItemList> call, Throwable t) {
        System.out.println("FAILURE" + t.toString());
    }
});

return list; 

}

4 - 使用您的活动/片段中的界面。

public class yourActivity implements OnDataLoaded 

5 - 您的控件将转移到您的活动方法onDataLoaded

@Override
public void onDataLoaded(ItemList itemList){
  // your item list will be available here.
  // you can use your bindings here.

   }

注意:在没有任何IDE的情况下编写。可能包含一些语法错误。

答案 1 :(得分:1)

onResponse是一种异步方法 您应该调用使用onResponse中的列表的方法:

,而不是返回列表
@Override
public void onResponse(Call<ItemList> call, Response<ItemList> response) {
    methodThatUsesList(response.body());
}