Java SharedReferences返回错误的值

Java SharedReferences返回错误的值,java,android,sharedpreferences,Java,Android,Sharedpreferences,我对android和java相当陌生,我通过点击列表视图中的一个项目从互联网上获取一些数据,但我需要两个电话来获取我需要的信息。当我从第一个调用中获得int值时,我将它传递给第二个方法,该方法进行自己的调用,获取一个值,并将其放入SharedPref中。当我尝试在第一个方法中检索回数据时,首先它返回默认值“”,但当我单击第二项时,它显示第一次应该调用的结果,第三次单击时,它显示第二个结果等 我试过使用数据库,现在我试着使用SharedPref,结果总是一样的。尝试将方法调用放入线程中,但仍然相同

我对android和java相当陌生,我通过点击列表视图中的一个项目从互联网上获取一些数据,但我需要两个电话来获取我需要的信息。当我从第一个调用中获得int值时,我将它传递给第二个方法,该方法进行自己的调用,获取一个值,并将其放入SharedPref中。当我尝试在第一个方法中检索回数据时,首先它返回默认值“”,但当我单击第二项时,它显示第一次应该调用的结果,第三次单击时,它显示第二个结果等

我试过使用数据库,现在我试着使用SharedPref,结果总是一样的。尝试将方法调用放入线程中,但仍然相同

这是我的第一个方法,它调用第二个方法spendingCategory

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();