Я работаю над двумя приложениями, в одном из моих приложений "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();
}
});
}
после применения этого метода и при отладке этого метода я сохраню значения переменных."and" townsid "за пределами onResponse.
Но применив модификацию 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
}
});