Я новичок в 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.




Проверьте это:
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, "");
SharedPreference.apply() — этот метод асинхронно (позже) сохраняет изменения. SharedPreference.commit() — этот метод синхронно (мгновенно).
Retrofit enqueue() — это асинхронный вызов. Таким образом, вы не можете быть уверены в порядке исполнения.
Для вашей проблемы вы должны выполнить действие после ответа на вызов второго метода, т.е.
Изменить метод на
spendingCategory(int categoryId,SingleFeed data)
добавьте ниже код внутри 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();
Я думаю, что в соответствии с приведенной выше реализацией вам не потребуются общие предпочтения для вышеуказанного вызова.
Возможный дубликат SharedPreferences читает старые значения