我正在使用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);
不将调用提交到侦听器中是合乎逻辑的,因为它将变为递归并导致StackOverflow.但我不明白的是为什么这个代码在更高版本的androID上运行良好(在> 4.X上测试).但是当我在androID 2.3上使用它时,它会导致预期的错误.
我如何能:
>让它在旧版本的AndroID上运行
要么
>添加一个异常,当我在其中调用commit()时不激活侦听器?
解决方法:
使用基本案例总是可以避免无限循环问题的递归.基本情况的功能是在应用程序达到特定的预定义状态时停止递归.
在您的情况下,您可以使用以下解决方案之一:
1)当您使用跳过条件时,取消注册OnSharedPreferencechangelistener
sharedPreferences.unregisterOnSharedPreferencechangelistener(Listener);
2)在类中创建全局布尔标志并在OnSharedPreferencechangelistener中执行逻辑之前检查它,并在到达基本情况时将其设置为false
private boolean changesFlag = true;
总结 以上是内存溢出为你收集整理的android – 在OnSharedPreferenceChangeListener()中使用commit()全部内容,希望文章能够帮你解决android – 在OnSharedPreferenceChangeListener()中使用commit()所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)