SharedPreferences возвращает неправильное значение - PullRequest
0 голосов
/ 12 мая 2019

Я довольно новичок в android и java, я вытаскиваю некоторые данные из интернета, нажимая на элемент в виде списка, но мне нужно 2 звонка, чтобы получить нужную мне информацию. Когда я получаю значение int из первого вызова, я передаю его второму методу, который выполняет свой собственный вызов, получает значение и помещает его в SharedPref. Когда я пытаюсь получить данные обратно в первом методе, сначала он возвращает значение по умолчанию «», но когда я нажимаю на второй элемент, он показывает результат, который должен был быть вызван в первый раз, при третьем щелчке он показывает второй результат и т.д ...

Я пытался с базами данных, и теперь я пытаюсь с SharedPref, всегда тот же результат. Пытался поместить вызов метода в поток, все тот же ...

Это мой первый метод, который вызывает второй, называемый тратой категории

private void listViewFunction() {
        lvItems.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                int userId = arrayList.get(position).idUser;
                Retrofit retrofit = new Retrofit.Builder()
                        .baseUrl(URL)
                        .addConverterFactory(GsonConverterFactory.create())
                        .build();

                TrikoderAPI trikoderAPI = retrofit.create(TrikoderAPI.class);
                Call<SingleFeed> call = trikoderAPI.getSingleFeed(userId);
                call.enqueue(new Callback<SingleFeed>() {
                    @Override
                    public void onResponse(Call<SingleFeed> call, Response<SingleFeed> response) {
                        SingleFeed data = response.body();

                        final int categoryId = data.getData().getRelationships().getSpendingCategory().getData().getId();
                        spendingCategory(categoryId);

                        String info;
                        info = sp.getString(CATEGORY_NAME, "");

                        String result = getString(R.string.type) + data.getData().getType() + "\n"
                                + getString(R.string.id) + data.getData().getId() + "\n"
                                + getString(R.string.amount) + data.getData().getAttributes().getAmount() + "\n"
                                + getString(R.string.remark) + data.getData().getAttributes().getRemark() + "\n"
                                + getString(R.string.name) + data.getData().getAttributes().getName() + "\n"
                                + getString(R.string.date) + data.getData().getAttributes().getDate() + "\n"
                                + getString(R.string.category) + info;

                        popUpWindow(result);
                        editor.clear();
                        editor.commit();

                    }

                    @Override
                    public void onFailure(Call<SingleFeed> call, Throwable   t) {
                        Toast.makeText(MainActivity.this, getString(R.string.somethingWrong) + t.getMessage(), Toast.LENGTH_SHORT).show();
                    }
                });
            }
        });
    }

И это второй метод

private void spendingCategory(int categoryId) {
        Retrofit retrofit = new Retrofit.Builder()
                .baseUrl(URL)
                .addConverterFactory(GsonConverterFactory.create())
                .build();

        TrikoderAPI trikoderAPI = retrofit.create(TrikoderAPI.class);
        Call<SingleCategory> call = trikoderAPI.getCategoryFeed(categoryId);
        call.enqueue(new Callback<SingleCategory>() {
            @Override
            public void onResponse(Call<SingleCategory> call, Response<SingleCategory> response) {
                SingleCategory data = response.body();

                String result = data.getData().getAttributes().getName();
                Log.d(TAG, "onResponse: " + result);

                sp.edit().putString(CATEGORY_NAME, result).apply();

            @Override
            public void onFailure(Call<SingleCategory> call, Throwable t) {
                Toast.makeText(MainActivity.this, getString(R.string.somethingWrong), Toast.LENGTH_SHORT).show();
            }
        });
    }

Я ожидаю, что первым выводом будет значение строки результата, а не значение по умолчанию, полученное из SharedPref

Ответы [ 2 ]

0 голосов
/ 12 мая 2019

SharedPreference.apply () - этот метод асинхронно (позже) сохраняет изменения.SharedPreference.commit () - этот метод синхронно (мгновенно).

Модификация enqueue () является асинхронным вызовом.Таким образом, вы не можете точно определить порядок выполнения.

Для вашей проблемы вы должны выполнить действие после ответа на второй вызов метода, т. Е. MaintenanceCategory

Измените метод на

spendingCategory(int categoryId,SingleFeed data)

addприведенный ниже код внутри onResponse ()

...
  String result = data.getData().getAttributes().getName();
                Log.d(TAG, "onResponse: " + result);

                sp.edit().putString(CATEGORY_NAME, result).commit();
String info;
info = sp.getString(CATEGORY_NAME, "");

String result = getString(R.string.type) + data.getData().getType() + "\n"
                + getString(R.string.id) + data.getData().getId() + "\n"
                + getString(R.string.amount) + 
                data.getData().getAttributes().getAmount() + "\n"
               + getString(R.string.remark) + 
               data.getData().getAttributes().getRemark() + "\n"
               + getString(R.string.name) + 
              data.getData().getAttributes().getName() + "\n"
              + getString(R.string.date) + 
               data.getData().getAttributes().getDate() + "\n"
               getString(R.string.category) + info;

                        popUpWindow(result);
                        editor.clear();
                        editor.commit();

Я думаю, что в приведенной выше реализации вам не потребуются общие предпочтения для вышеуказанного вызова.

0 голосов
/ 12 мая 2019

Проверьте это:

spendingCategory(categoryId,data);

Теперь, перейдите ниже кода внутри сетевого вызова категории расходов, введите этот код:

                   String result = getString(R.string.type) + data.getData().getType() + "\n"
                            + getString(R.string.id) + data.getData().getId() + "\n"
                            + getString(R.string.amount) + data.getData().getAttributes().getAmount() + "\n"
                            + getString(R.string.remark) + data.getData().getAttributes().getRemark() + "\n"
                            + getString(R.string.name) + data.getData().getAttributes().getName() + "\n"
                            + getString(R.string.date) + data.getData().getAttributes().getDate() + "\n"
                            + getString(R.string.category) + info;



                    String result2 = data2.getData().getAttributes().getName();
                    Log.d(TAG, "onResponse: " + result2);

                    sp.edit().putString(CATEGORY_NAME, result2).apply();
                    String info;
                    info = sp.getString(CATEGORY_NAME, "");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...