最近我开始使用改装,我很难尝试了解它是如何工作的。
我试图将一个在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但我真的不想进入它。
感谢您的所有评论,谢谢!
答案 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());
}