我使用的是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上使用它时,它会导致预期的错误。
我如何:
答案 0 :(得分:1)
使用基本情况总是可以避免无限循环问题的递归。 基本情况的功能是在您的应用达到特定的预定义状态时停止递归。
在这种情况下,您可以使用以下解决方案之一:
1)使用
在发生跳过条件时取消注册OnSharedPreferenceChangeListener
sharedPreferences.unregisterOnSharedPreferenceChangeListener(listener);
2)在flag
中创建全局布尔值class
并在OnSharedPreferenceChangeListener
中执行逻辑之前检查它,并在到达false >基本案例
private boolean changesFlag = true;