Доступ к данным дооснащения 2 снаружи при ответе? - PullRequest
0 голосов
/ 12 июня 2019

Я работаю над двумя приложениями, в одном из моих приложений "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
            }
        });

1 Ответ

0 голосов
/ 14 июня 2019

единственное, что пришло в голову, это то, что получение данных может занять некоторое время, пока ваши строки кода читаются и поиск нулевых значений, поскольку данные еще не получены.

Это совершенно правильно.Ваш звонок заканчивается после того, как вы проверите значения.Я собираюсь остановиться здесь и сказать, что это просто совпадение, что это работает в одном приложении, а не в другом (если они на самом деле делают это одинаково)

Когда вы звоните 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 - это когда вы можете использовать свои глобальные переменные.Может быть, лучше прекратить использование глобальных переменных и просто использовать параметры обратного вызова.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...