最奇怪的事情:布尔在if语句后变为false?

时间:2016-02-29 00:15:39

标签: java android string algorithm performance

如果这一切看起来令人困惑,请忽略我所说的,并查看代码和标题为“Heres the strange Part”的部分。另外,请查看我底部的日志。

所以基本上,我使用共享首选项只做一次以下是我的工作:

  1. 检查共享首选项是否为false,这是默认值
  2. 如果是这样,当用户点击“Never again again”时,将共享首选项更改为true,这样if语句就不会通过。
  3. 因此,如果用户没有启用位置,我会检查共享首选项,看看他们是否要我显示对话框,如果共享首选项为false,我会显示它。

        LocationManager locationManager = 
             (LocationManager) getSystemService(Context.LOCATION_SERVICE);
    
          if (!locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER) &&
             !locationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER) && 
             dialogPrefs.getBoolean("show", false) == false) {
    
               Log.v(TAG, dialogPrefs.getBoolean("show", false) +" GET BOOLEAN");
    
               new AlertDialog.Builder(this)
                            .setTitle("Location not enabled ")
                            .setMessage("Blah")
                            .setNegativeButton("Remind again when I come to this activity", null)
                            .setNeutralButton("Don't show again...EVER!!!", new DialogInterface.OnClickListener() {
                                @Override
                                public void onClick(DialogInterface dialog, int which) {
                                    dialogEditor.putBoolean("show", true);
                                    dialogEditor.commit();
    
    
                                    Log.v(TAG, dialogPrefs.getBoolean("show", false) +" GET BOOLEAN");
                                }
                            })
                            .setPositiveButton("Enable", new DialogInterface.OnClickListener() {
    
                                public void onClick(DialogInterface dialog, int which) {
                                    //All location services are disabled
                                    Intent gpsOptionsIntent = new Intent(
                                            android.provider.Settings.ACTION_LOCATION_SOURCE_SETTINGS);
                                    startActivity(gpsOptionsIntent);
                                }
                            }).show();
    
                }
    

    注意我的日志。

    HERES THE WEIRD PART:

    if语句总是通过...在我的日志中,我在第一次提交更改后检查dialogPrefs.getBoolean的值,它是 true < / strong>(这很好)!然后,突然,该方法再次被调用,dialogPrefs.getBoolean为FALSE!

    为什么这个布尔值会改变?这是最奇怪的事情,因为它是一个如此简单的问题,并且以一种意想不到的方式表现。

    我的logcat看起来像这样:

    V/myTag: false GET BOOLEAN //This is when the popup comes
    V/myTag: true GET BOOLEAN //After I change value
    V/myTag: false GET BOOLEAN //AFTER COMING BACK TO ACTIVITY!! WHY FALSE AGAIN!?!?
    

    编辑:

    我在onCreate初始化:

    dialogPrefs = PreferenceManager.getDefaultSharedPreferences(getApplicationContext()); 
    
    dialogEditor = dialogPrefs.edit();
    

1 个答案:

答案 0 :(得分:0)

当你调用dialogPrefs.edit()时,你会得到一个Editor实例,然后不再使用该实例,并且可能会收集垃圾。所以下次你打电话给它时,它没有被保存。

您可能还想使用dialogPrefs.apply而不是dialogPrefs.commit。提交是同步完成的,并返回是否已成功保存,其中apply是异步且更快(因为大多数人都没有检查响应)

preferences = getApplicationContext().getSharedPreferences(PREFERENCES_NAME, 0);
SharedPreferences.Editor dialogEditor = preferences.edit();
dialogEditor.putBoolean("show", true);
dialogEditor.apply();