registerOnSharedPreferenceChangeListener一段时间后停止调用

时间:2014-07-03 13:53:20

标签: android performance android-intent android-activity android-event

我有一个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;
    }
}

1 个答案:

答案 0 :(得分:3)

OnSharedPreferenceChangeListener是通过弱引用注册的。确保通过将侦听器设置为实例变量来保留对侦听器的引用。