OnSharedPreferenceChangeListener并不总是有效

时间:2014-11-16 12:11:31

标签: android facebook sharedpreferences

我在MainActivity的OnCreate()方法中获得了以下OnSharedPreferenceChangeListener:

SharedPreferences.OnSharedPreferenceChangeListener listener = new SharedPreferences.OnSharedPreferenceChangeListener(){
    @Override public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key){
        if (key.equals("session_open")) {
            signedIn = prefs.getBoolean("session_open", false);
            if (signedIn) {
                SlidingTabFragment fragment = new SlidingTabFragment();
                getSupportFragmentManager()
                        .beginTransaction()
                        .replace(R.id.spotview_content_fragment, fragment)
                        .commit();
                mDrawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_UNLOCKED);
                drawerLearned = prefs.getBoolean("drawer_learned", false);
                if (!drawerLearned) {
                    mDrawerLayout.openDrawer(mDrawerList);
                }
            } else {
                MainFragment mainFragment = new MainFragment();
                getSupportFragmentManager()
                        .beginTransaction()
                        .replace(R.id.spotview_content_fragment, mainFragment)
                        .commit();
                mDrawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_CLOSED);
            }
        }
    }
};
prefs.registerOnSharedPreferenceChangeListener(listener);

prefs变量初始化为prefs = PreferenceManager.getDefaultSharedPreferences(getApplicationContext());我还在片段中有一个facebook登录按钮,其中包含以下OnSessionChanged方法:

private void onSessionStateChange(Session session, SessionState state, Exception exception) {
    if (state.isOpened()) {
        editor.putBoolean("session_open", true);
    } else if (state.isClosed()) {
        editor.putBoolean("session_open", false);
    }
    editor.commit();
}

prefs = PreferenceManager.getDefaultSharedPreferences(this.getActivity().getApplicationContext());
editor = prefs.edit();

这个想法是,每当用户使用fb按钮登录或注销时,SharedPreferences都会更新,并且侦听器会对此进行选择并相应地更改布局。但是,这似乎总是起作用。大部分时间它确实有效,但有时它突然停止工作,我必须关闭应用程序并重新启动它以使其再次工作。然后,SharedPreferences已经更改,因为它以正确的布局打开(还检查OnCreate方法中的SharedPreferences,确保它在启动时加载正确的布局)。听众只是没有接受它。有人可以向我解释这里出了什么问题以及如何解决这个问题?如果您需要查看更多我的代码,请询问,我会发布您需要的内容。提前谢谢!

1 个答案:

答案 0 :(得分:1)

我通过更改

修复了它
SharedPreferences.OnSharedPreferenceChangeListener listener = new SharedPreferences.OnSharedPreferenceChangeListener(){
    @Override public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key){

listener = new SharedPreferences.OnSharedPreferenceChangeListener() {
    @Override public void onSharedPreferenceChanged(SharedPreferences prefs, String key) {

并将侦听器更改为私有变量。我还添加了以下@Override函数:

    @Override
    public void onDestroy(){
        super.onDestroy();
        prefs.unregisterOnSharedPreferenceChangeListener(listener);
    }

    @Override
    public void onPause(){
        super.onPause();
        prefs.unregisterOnSharedPreferenceChangeListener(listener);
    }

    @Override
    public void onResume(){
        super.onResume();
        prefs.registerOnSharedPreferenceChangeListener(listener);
    }

现在它每次都有效。