在OnSharedPreferenceChangeListener()中使用commit()

时间:2014-08-09 13:11:28

标签: android performance persistence sharedpreferences

我使用的是OnSharedPreferenceChangeListener():

listener=new SharedPreferences.OnSharedPreferenceChangeListener() {

    @Override
    public void onSharedPreferenceChanged(SharedPreferences sharedPreferences,
            String key) {
        if(key.equals("TIME"))
        {
            Log.v("Tagger","Value has changed");
            long L=-2;
            if(sharedPreferences.contains("TIME"))
            {
                L=sharedPreferences.getLong("TIME", 0);
                long  HH=(L/1000)/3600; 
                long MM=((L/1000)/60)%60;
                long SS=(L/1000)%60;
                MILLIS-=1000;
                mainHH.setText(Long.toString(HH));
                mainMM.setText(Long.toString(MM));
                mainSS.setText(Long.toString(SS));
            }
            if(L<=0)
            {
                Editor edit=sharedPreferences.edit();
                edit.remove("TIME");
                edit.commit();

                Log.v("VALUE",Long.toString(454L));
                Intent intent = new Intent(getApplicationContext(), TimerAlarmReceiver.class);
                PendingIntent pendingIntent = PendingIntent.getBroadcast(getApplicationContext(), 0, intent, 0);
                TimerAlarmReceiver.alarmMgr = (AlarmManager)getSystemService(Context.ALARM_SERVICE);
                TimerAlarmReceiver.alarmMgr.cancel(pendingIntent);
                start.setText("Start the Test?");
                TimerOn=false;

                edit.putBoolean("TimerOn", TimerOn);
                edit.commit();          
            }
        }
    }
};
sharedPreferences.registerOnSharedPreferenceChangeListener(listener);

commit调用放在侦听器中是合乎逻辑的,因为它将变为递归并导致StackOverflow。但是我不明白为什么这个代码在更高版本的android上运行正常(在&gt; 4.X上测试)。但是当我在android 2.3上使用它时,它会导致预期的错误。

我如何:

  1. 让它在旧版本的Android上运行                      OR
  2. 添加一个异常,当我在其中调用commit()时,不会触发侦听器吗?

1 个答案:

答案 0 :(得分:1)

使用基本情况总是可以避免无限循环问题的递归。 基本情况的功能是在您的应用达到特定的预定义状态时停止递归。

在这种情况下,您可以使用以下解决方案之一:

1)使用

在发生跳过条件时取消注册OnSharedPreferenceChangeListener
sharedPreferences.unregisterOnSharedPreferenceChangeListener(listener);

2)在flag中创建全局布尔值class并在OnSharedPreferenceChangeListener中执行逻辑之前检查它,并在到达false >基本案例

private boolean changesFlag = true;