• SharePreference 注册 registerOnSharedPreferenceChangeListener 无法回调的问题


    以前一直没有用过 registerOnSharedPreferenceChangeListener 回调方法,今天用到了,就设置了下,结果发现不起作用,因为一直没有回调。
    代码:

        mSp = this.getSharedPreferences(HuaweiPushReceiver.SP_Name, MODE_PRIVATE);
        mSp.registerOnSharedPreferenceChangeListener(new SharedPreferences.OnSharedPreferenceChangeListener() {
            @Override
            public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {
                String token = sharedPreferences.getString(HuaweiPushReceiver.SP_KEY, null);
                tv.setText("sp token:" + token);
                Log.d(TAG, "sp token:" + token);
            }
        });
    

    然后就搜索和看源码,已经有人提出了这个问题及解决办法,因为 SharedPreferences 的实现类 SharedPreferencesImpl 中对于观察者模式的储存使用的是 WeakHashMap ,所以当储存的 key 没有使用的时候就会回收掉,而上面的代码中使用的是匿名内部类,所以就容易被 GC 掉。
    源码:

    private final WeakHashMap<OnSharedPreferenceChangeListener, Object> mListeners =
            new WeakHashMap<OnSharedPreferenceChangeListener, Object>();
    
    SharedPreferencesImpl(File file, int mode) {
        mFile = file;
        mBackupFile = makeBackupFile(file);
        mMode = mode;
        mLoaded = false;
        mMap = null;
        startLoadFromDisk();
    }
    
    ...
    
    public void registerOnSharedPreferenceChangeListener(OnSharedPreferenceChangeListener listener) {
        synchronized(this) {
            mListeners.put(listener, mContent);
        }
    }
    

    解决办法:
    不使用匿名内部类,同时在 onStart() 中注册,在 onStop() 中取消注册。

    SharedPreferences mSp;
    
    SharedPreferences.OnSharedPreferenceChangeListener mListener = new SharedPreferences
            .OnSharedPreferenceChangeListener() {
        @Override
        public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {
            String token = sharedPreferences.getString(HuaweiPushReceiver.SP_KEY, null);
            tv.setText("sp token:" + token);
            Log.d(TAG, "sp token:" + token);
        }
    };
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        ...
    
        mSp = this.getSharedPreferences(HuaweiPushReceiver.SP_Name, MODE_PRIVATE);
    }
    ...
    }
    
    @Override
    protected void onStart() {
        super.onStart();
        mClient.connect();
        mSp.registerOnSharedPreferenceChangeListener(mListener);
    }
    
    @Override
    protected void onStop() {
        mSp.unregisterOnSharedPreferenceChangeListener(mListener);
        super.onStop();
    }
  • 相关阅读:
    每周总结
    4月9日学习日志
    4月8日学习日志
    4月7日学习日志
    4月6日学习日志
    Cypress存取时间为10纳秒的异步SRAM
    超低功耗MCU如何降低功耗
    集成铁电存储器MCU为物联网应用提供出色性能
    读取优先和SRAM-MRAM混合结构
    磁阻式随机存储器MRAM基本原理
  • 原文地址:https://www.cnblogs.com/liyiran/p/6558911.html
Copyright © 2020-2023  润新知