Java SharedReferences返回错误的值
我对android和java相当陌生,我通过点击列表视图中的一个项目从互联网上获取一些数据,但我需要两个电话来获取我需要的信息。当我从第一个调用中获得int值时,我将它传递给第二个方法,该方法进行自己的调用,获取一个值,并将其放入SharedPref中。当我尝试在第一个方法中检索回数据时,首先它返回默认值“”,但当我单击第二项时,它显示第一次应该调用的结果,第三次单击时,它显示第二个结果等 我试过使用数据库,现在我试着使用SharedPref,结果总是一样的。尝试将方法调用放入线程中,但仍然相同 这是我的第一个方法,它调用第二个方法spendingCategoryJava SharedReferences返回错误的值,java,android,sharedpreferences,Java,Android,Sharedpreferences,我对android和java相当陌生,我通过点击列表视图中的一个项目从互联网上获取一些数据,但我需要两个电话来获取我需要的信息。当我从第一个调用中获得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 listViewFunction(){
lvItems.setOnItemClickListener(新的AdapterView.OnItemClickListener(){
@凌驾
public void onItemClick(AdapterView父对象、视图、整型位置、长id){
int userId=arrayList.get(position).idUser;
改装改装=新改装.Builder()
.baseUrl(URL)
.addConverterFactory(GsonConverterFactory.create())
.build();
TrikoderAPI TrikoderAPI=改装.create(TrikoderAPI.class);
Call Call=trikoderAPI.getSingleFeed(userId);
call.enqueue(新回调(){
@凌驾
公共void onResponse(调用、响应){
SingleFeed数据=response.body();
final int categoryId=data.getData().getRelationships().getSpendingCategory().getData().getId();
支出类别(类别ID);
字符串信息;
info=sp.getString(类别名称“”);
字符串结果=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;
弹出窗口(结果);
编辑器.clear();
commit();
}
@凌驾
失败时公共无效(调用调用,可丢弃的t){
Toast.makeText(MainActivity.this,getString(R.string.SomethingError)+t.getMessage(),Toast.LENGTH\u 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();
}
});
}
private void spendingCategory(int categoryId){
改装改装=新改装.Builder()
.baseUrl(URL)
.addConverterFactory(GsonConverterFactory.create())
.build();
TrikoderAPI TrikoderAPI=改装.create(TrikoderAPI.class);
Call Call=trikoderAPI.getCategoryFeed(categoryId);
call.enqueue(新回调(){
@凌驾
公共void onResponse(调用、响应){
SingleCategory数据=response.body();
字符串结果=data.getData().getAttributes().getName();
Log.d(标签“onResponse:+结果);
sp.edit().putString(类别名称、结果).apply();
@凌驾
失败时公共无效(调用调用,可丢弃的t){
Toast.makeText(MainActivity.this、getString(R.string.somethingError)、Toast.LENGTH\u 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, "");
SharedReference.apply()-此方法异步(稍后)保存更改。SharedReference.commit()-此方法同步(立即)执行 改型enqueue()是异步调用。因此,您无法确定执行顺序 对于您的问题,您必须在第二个方法调用响应之后执行操作,即spendingCategory 将方法更改为
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();