我有一个sharedPreference,它从一个扩展BroadcastReceiver的类中连续更新(大约每秒一次)。
前几次调用registerOnSharedPreferenceChangeListener,但过了一会儿,它就会停止调用(我甚至不按模拟器上的任何按钮)。
我知道sharedPreference仍在更新,因为我已经看到了我的日志。这是registerOnSharedPreferenceChangeListener的一个问题。
这是侦听器的代码(使用here中的建议)
我的共享偏好几乎每秒更新一次。
以下是我的听众的代码:
SharedPreferences.OnSharedPreferenceChangeListener listener=new SharedPreferences.OnSharedPreferenceChangeListener() {
@Override
public void onSharedPreferenceChanged(SharedPreferences sharedPreferences,
String key) {
// TODO Auto-generated method stub
if(key=="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);
我提供了完整的代码,因为其他可能是问题。
EDIT :: 这是我的BroadcastReceiver类
public class TimerAlarmReceiver extends BroadcastReceiver {
public static long TIME;
public static Boolean TimerOn=false;
public static AlarmManager alarmMgr ;
@Override
public void onReceive(Context context, Intent intent) {
//Toast.makeText(context, "Alarm went off", Toast.LENGTH_SHORT).show();
/* SharedPreferences sharedPreferences = PreferenceManager
.getDefaultSharedPreferences(context);
Editor editor = sharedPreferences.edit();
editor.putLong(key, value);
editor.commit();*/
SharedPreferences time = PreferenceManager
.getDefaultSharedPreferences(context);
long T = time.getLong("TIME",594554L);
Editor editor=time.edit();
editor.putLong("TIME", T-1000);
editor.commit();
Log.v("Tag", Long.toString(T));
//this gets updated and i can see the new values of T
}
public static void setTime(long T)
{
TIME=TimerActivity.DMILLIS;
}
}
答案 0 :(得分:3)
OnSharedPreferenceChangeListener
是通过弱引用注册的。确保通过将侦听器设置为实例变量来保留对侦听器的引用。