【问题标题】:SharedPreferences does not permanently save dataSharedPreferences 不会永久保存数据
【发布时间】:2017-05-14 16:51:40
【问题描述】:

我在 SharedPreferences 函数中更改了数据,当我在同一个活动中调用时数据是最新的,但当交换活动不是最新的时。

我使用此功能更新数据:

public static String setVal(Context context, String val){
        String LOGIN = "Login";
        SharedPreferences pref = context.getSharedPreferences(LOGIN, Context.MODE_PRIVATE);
        SharedPreferences.Editor editor2 = pref.edit();
        editor2.remove("creditiApp");
        editor2.putString("creditiApp",val);
        editor2.apply();
        editor2.commit();

        String LOGIN2 = "Login";
        SharedPreferences pref2 = context.getSharedPreferences(LOGIN2, Context.MODE_PRIVATE);
        return pref2.getString("creditiApp","0");
    }

我在异步任务中调用这个函数,更准确地说是在“onPostExecute”中:

protected void onPostExecute(String result) {
            String[] results = result.split("///---");
            if( results[0].equals("true") ){
                String LOGIN = "Login";
                SharedPreferences pref = getSharedPreferences(LOGIN, Context.MODE_PRIVATE);
                String crediti22 = pref.getString("creditiAPP","no");
                codiceEdit.setText(results[1]);
                Bitmap bit = img.getBitmapFromURL(results[2]);
                Bitmap bit2 = img.getRoundedCornerBitmap(bit,500);
                imgTonda.setImageBitmap(bit2);
                titolo.setText(results[3]);
                autore.setText(results[4]);
                int creditiNecessari = Integer.valueOf(results[5]);
                int creditiDisponibiliDB = Integer.valueOf(results[6]);
                int creditiDisponibiliApp = Integer.valueOf(crediti22);
                if( creditiDisponibiliDB == creditiDisponibiliApp ){
                    crediti.setText(getString(R.string.pubbCrediti)+" "+creditiNecessari);
                    crediti2.setText(getString(R.string.pubbCrediti2)+" "+creditiDisponibiliApp);
                }else{
                    String str = setVal(getApplicationContext(),String.valueOf(creditiDisponibiliDB));
                    Log.d("crediti",str );


                    NavigationView navigationView = (NavigationView) findViewById(R.id.nav_view);
                    View header = navigationView.getHeaderView(0);
                    TextView crediti_view = (TextView) header.findViewById(R.id.creditiMenu);
                    crediti_view.setText(getString(R.string.creditiDisp)+" "+creditiDisponibiliDB+" "+getString(R.string.crediti));
                    crediti.setText(getString(R.string.pubbCrediti)+" "+creditiNecessari);
                    crediti2.setText(getString(R.string.pubbCrediti2)+" "+creditiDisponibiliDB);
                }
                if( creditiDisponibiliDB >= creditiNecessari ){
                    guadagna.setVisibility(View.GONE);
                    download.setVisibility(View.VISIBLE);
                    download.setOnClickListener(new OnClickListener() {
                        @Override
                        public void onClick(View v) {
                            Intent intent = new Intent(pubblicita.this,home.class);
                            intent.putExtra("codice",codice);
                            startActivity(intent);
                            finish();
                        }
                    });
                }else{
                    guadagna.setOnClickListener(new OnClickListener() {
                        @Override
                        public void onClick(View v) {
                            intro.setVisibility(View.GONE);
                            showProgress(true);
                            pubb.setVisibility(View.VISIBLE);
                            showProgress(false);
                            closePubb.setVisibility(View.GONE);
                            barTimer.setVisibility(View.VISIBLE);
                            timeText.setVisibility(View.VISIBLE);
                            barTimer.startAnimation(an);
                            startTimer(1);
                        }
                    });
                }
                intro.setVisibility(View.VISIBLE);
            }else{
                crediti.setVisibility(View.GONE);
                crediti2.setVisibility(View.GONE);
                autore.setVisibility(View.GONE);
                guadagna.setVisibility(View.GONE);
                titolo.setText(getString(R.string.errorePubblicita));
                intro.setVisibility(View.VISIBLE);
            }
            showProgress(false);
            mAuthTask = null;
        }

同样在日志中数据被更新,但是当调用另一个活动时数据没有被更新:

@Override
    protected void onStart(){
        super.onStart();
        NavigationView navigationView = (NavigationView) findViewById(R.id.nav_view);
        View header = navigationView.getHeaderView(0);
        TextView nome_view = (TextView) header.findViewById(R.id.nome_view);
        TextView email_view = (TextView) header.findViewById(R.id.email_view);
        TextView crediti_view = (TextView) header.findViewById(R.id.creditiMenu);
        String LOGIN = "Login";
        SharedPreferences pref = getSharedPreferences(LOGIN, Context.MODE_PRIVATE);
        String nome = pref.getString("nomeAPP","ciao");
        String cognome = pref.getString("cognomeAPP","ciao");
        String email = pref.getString("emailAPP","ciao");
        String crediti = pref.getString("creditiAPP","ciao");
        String nome_completo = nome+" "+cognome;
        nome_view.setText(nome_completo);
        email_view.setText(email);
        crediti_view.setText(getString(R.string.creditiDisp)+" "+crediti+" "+getString(R.string.crediti));
    }

你有什么建议给我吗?

【问题讨论】:

    标签: android sharedpreferences android-sharedpreferences


    【解决方案1】:

    检查你的键 sharedpreference 键是区分大小写的,我看到两个 diff 键

    creditiAPP creditiApp

    做上面的改变它会起作用

    【讨论】:

    • 非常感谢,我为这个小错误感到羞耻
    • 为避免此类问题,您必须将键、标签设为常量并在您想要的地方使用它
    【解决方案2】:
    editor2.apply();
    editor2.commit();
    

    只做其中一项。不是两者,只有一个。由于您似乎是从主应用程序线程调用此代码,请使用apply()

    您还有the bug that Pavan points out。您可以通过定义一次字符串来避免此问题,将static final String 字段用作常量,而不是尝试在多个地方使用相同的文字字符串。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-14
      • 2021-10-19
      • 1970-01-01
      相关资源
      最近更新 更多