【问题标题】:SharedPreferences returns wrong valueSharedPreferences 返回错误值
【发布时间】:2019-05-12 10:20:49
【问题描述】:

我对 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 获得的默认值

【问题讨论】:

标签: java android sharedpreferences


【解决方案1】:

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

我认为通过上述实现,您不需要对上述调用共享偏好。

【讨论】:

    【解决方案2】:

    检查一下:

    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, "");
    

    【讨论】:

      猜你喜欢
      • 2016-06-18
      • 2012-09-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-02-03
      • 1970-01-01
      • 2015-06-19
      • 2014-01-16
      相关资源
      最近更新 更多