我无法在Restrofit
中获取onResponse以外的数据这是我的代码
List<Categorie> categorylist=new ArrayList<>();
Retrofit retrofit = new Retrofit.Builder()
.baseUrl(baseUrl)
.addConverterFactory(GsonConverterFactory.create())
.build();
final CategoryApi api = retrofit.create(CategoryApi.class);
Call<List<Categorie>> categoryCall = api.categories();
categoryCall.enqueue(new Callback<List<Categorie>>() {
@Override
public void onResponse(Call<List<Categorie>> call, Response<List<Categorie>> response) {
categorylist = (List<Categorie>)response.body();
Log.i("success","Inside "+categorylist.toString());
// here i get the data
}
@Override
public void onFailure(Call<List<Categorie>> call, Throwable t) {
System.out.println("Erreur");
}
});
Log.i("success","Outside "+categorylist.toString());
// here i get null
我已经尝试将类别列表设置为volatile和static而且它不起作用
答案 0 :(得分:0)
您似乎在致电categorylist
后立即尝试访问categoryCall.enqueue
。 enqueue
是一个异步操作,在执行下一行(包含categorylist.toString()
)之前无法完成。
尝试调用另一种方法,在此处您已离开评论&#34;此处我获取数据&#34;
public void onResponse(/*...*/ response) {
categorylist = (List<Categorie>)response.body();
Log.i("success","Inside "+categorylist.toString());
// here i get the data
businessLogic(categorieslist);
}
private void businessLogc(List<Categorie> categories) {
myView.showCategories(categories); // or whatever you're doing with data
}
答案 1 :(得分:0)
你知道,http请求是一个需要时间的进程,所以它应该是异步完成的。幸运的是,改造为我们处理了一切。
您需要做的是,当我们从OnResponse获得响应时,您需要更新当前视图,例如,如果您使用的是recyclerview,则有recyclerview.notifyDataSetChanged()方法。
如果你想从头开始得到结果。我建议你在其他活动或其他地方调用enqueue方法,然后当你得到结果时,将它保存到sqlite数据库中。
然后当你打开CategoryActivity从数据库加载它。
您可以添加刷新按钮以再次调用enqueue来更新数据库。