我正在开发两个应用程序,其中一个应用程序“ A”应用了改造2。
这是我用来检索数据的方法。
但是在这里,在“响应”中,可以将在响应主体中检索到的数据设置为活动变量,并且可以在此方法之外使用而无需获取空值。
public void fetch_information() {
ApiInterface = ApiClient.getApiClient().create(Api.class);
Call<List<City>> call = ApiInterface.GetCities();
call.enqueue(new Callback<List<City>>() {
@Override
public void onResponse(Call<List<City>> call, Response<List<City>> response) {
citylist = new ArrayList<City>();
citylist = response.body();
cities = new String[citylist.size()];
citiesid = new String[citylist.size()];
for (int i = 0; i < citylist.size(); i++) {
cities[i] = citylist.get(i).getCityName();
citiesid[i] = citylist.get(i).getCityId();
}
city_adapter = new ArrayAdapter<String>(Pay_Payment_X.this, android.R.layout.simple_list_item_1, cities);
city_adapter.setDropDownViewResource(R.layout.spinner_dropdown_layout);
City_Spinner.setAdapter(city_adapter);
}
@Override
public void onFailure(Call<List<City>> call, Throwable t) {
Toast.makeText(getApplicationContext(), t.getMessage(), Toast.LENGTH_SHORT).show();
}
});
}
应用此方法并调试该方法后,我将在Response的外部保留变量“ cities”和“ citysid”的值。
但是类似地将改造2应用于另一个应用程序“ B”,我做了同样的事情来检索不同URL上的数据。
ApiUtil.getServiceClass().getAllPost().enqueue(new Callback<List<ApiObject>>() {
@Override
public void onResponse(Call<List<ApiObject>> call, Response<List<ApiObject>> response) {
if (response.isSuccessful()) {
List<ApiObject> postList = response.body();
try {
for (int i = 0; i < postList.size(); i++) {
String Name = postList.get(i).getGamesName();
mGamesName.add(Name);
}
} catch (Exception e) {
}
Log.d(TAG, "Returned count " + postList.size());
NewAdapter adapter = new NewAdapter(getApplicationContext(), postList);
recyclerView.setAdapter(adapter);
}
}
@Override
public void onFailure(Call<List<ApiObject>> call, Throwable t) {
//showErrorMessage();
Log.d(TAG, "error loading from API");
}
});
在onResponse内部可以检索数据,但在外部显示为空。 因此,这里的变量不保留值。
为什么会这样?
唯一想到的是,在读取代码行时检索数据可能会花费一些时间,并且由于尚未收到数据而查找空值。
还要提及在应用程序“ A”中检索到的数据巨大,但在应用程序“ B”中仅包含3个具有字符串值的对象。但是在应用程序“ A”中仍可检索到数据。
在应用2中,这样做是为了解决我的问题。
public void doRequest( final ApiCallback callback){
ApiUtil.getServiceClass().getAllPost().enqueue(new Callback<List<ApiObject>>() {
@Override
public void onResponse(Call<List<ApiObject>> call, Response<List<ApiObject>> response) {
if (response.isSuccessful()) {
List<ApiObject> postList = response.body();
callback.onSuccess(postList);
// apobject =response.body();
if(response.isSuccessful()) {
try {
for (int i = 0; i < postList.size(); i++) {
String Name = postList.get(i).getGamesName().toString();
mGamesName.add(Name);
}
} catch (Exception e) {
}
}
Log.d(TAG, "Returned count " + postList.size());
NewAdapter adapter = new NewAdapter(getApplicationContext(), postList);
recyclerView.setAdapter(adapter);
}
}
@Override
public void onFailure(Call<List<ApiObject>> call, Throwable t) {
//showErrorMessage();
Log.d(TAG, "error loading from API");
}
});
}
通过界面
public interface ApiCallback{
void onSuccess(List<ApiObject> result);
}
在“创建活动的视图”中,我称之为
doRequest(new ApiCallback(){
@Override
public void onSuccess(List<ApiObject> result){
//here i can set variable values
}
});
答案 0 :(得分:0)
唯一想到的是,在读取代码行时检索数据可能会花费一些时间,并且由于尚未收到数据而查找空值。
完全正确。检查值后,通话结束。我在这里要说的是巧合,它可以在一个应用程序上运行而不是在另一个应用程序上运行(如果他们实际上是以相同的方式运行的话)
致电callback.onSuccess(postList);
似乎也不正确,因为您尚未检查是否成功。这意味着response.body()
可能是null
,而response.errorBody()
将包含错误的正文。
如果您将callback.onSuccess
移到if
内,将得到解决:
if(response.isSuccessful()) {
callback.onSuccess(response.body());
try {
for (int i = 0; i < postList.size(); i++) {
String Name = postList.get(i).getGamesName().toString();
mGamesName.add(Name);
}
} catch (Exception e) {
}
最后但并非最不重要的一点是,在onSuccess
方法中可以使用全局变量的时间。也许最好停止使用全局变量,而只使用回调参数。