Использование commit () внутри OnSharedPreferenceChangeListener ()

Я использую 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 (проверен на> 4.X). Но когда я использую его на Android 2.3, он вызывает ожидаемую ошибку.

Как мне:

  1. Получите его работу на старых версиях Android android OR
  2. Добавить исключение, чтобы не возбуждать слушателя при вызове commit () внутри него?

Вы всегда можете избежать рекурсии с бесконечной задачей цикла, используя базовый регистр . Функция базового случая – остановить рекурсию, когда ваше приложение достигнет определенного заранее определенного состояния.

В этом случае вы можете использовать одно из следующих решений:

1) OnSharedPreferenceChangeListener когда ваше условие пропуска происходит с использованием

 sharedPreferences.unregisterOnSharedPreferenceChangeListener(listener); 

2) Создайте глобальный логический flag в свой class и проверьте его перед выполнением своей логики в OnSharedPreferenceChangeListener и установите его с false при достижении базового OnSharedPreferenceChangeListener

 private boolean changesFlag = true;