如何通过辛格尔顿和共享preferences类中的应用程序上下文 [英] How to Pass Application Context within Singleton and SharedPreferences Classes

查看:231
本文介绍了如何通过辛格尔顿和共享preferences类中的应用程序上下文的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

如何通过从Singleton类应用程序上下文共享preferences?我有一个片段里面的GridView的 onActivityCreated(捆绑savedInstanceState)在logcat的方法,对项目点击,我得到NullPointerException异常:

  5月3日至三十日:12:54.784:E / AndroidRuntime(1950年):致命异常:主要
五月3日至30日:12:54.784:E / AndroidRuntime(1950):显示java.lang.NullPointerException
五月3日至30日:12:54.784:E / AndroidRuntime(1950年):在Android的preference preferenceManager.getDefaultShared preferencesName(preferenceManager.java:374)。
五月3日至30日:12:54.784:E / AndroidRuntime(1950年):在Android的preference preferenceManager.getDefaultShared preferences(preferenceManager.java:369)。
五月3日至30日:12:54.784:E / AndroidRuntime(1950年):在com.example.duaapp.utility.Shared$p$pferencesSupplication.save(Shared$p$pferencesSupplication.java:35)

Singleton类

 公共类SingletonClass {    公共静态上下文的applicationContext;    公共静态INT fontSizeMin = 17;
    公共静态INT fontSizeMax = 35;公共静态最后弦乐keySelVerseFromList =keySelVerseFromList;
    公共静态最后弦乐keyFavVerses =keyFavVerses;
    公共静态最后弦乐keyListOfVerses =keyListOfVerses;    公共静态最后弦乐keyIsFavSelected =keyIsFavSelected;}

共享preferences

 公共类共享$ P $ {pferencesSupplication
        公共无效保存(字符串valueKey,字符串值){            共享preferences preFS = preferenceManager.getDefaultShared preferences(SingletonClass.applicationContext);
            共享preferences.Editor编辑= prefs.edit();
            edit.putString(valueKey,值);
            edit.commit();
        }        公共无效保存(字符串valueKey,int值){            共享preferences preFS = preferenceManager.getDefaultShared preferences(SingletonClass.applicationContext);
            共享preferences.Editor编辑= prefs.edit();
            edit.putInt(valueKey,值);
            edit.commit();
        }        公共无效保存(字符串valueKey,布尔值){            共享preferences preFS = preferenceManager.getDefaultShared preferences(SingletonClass.applicationContext);
            共享preferences.Editor编辑= prefs.edit();
            edit.putBoolean(valueKey,值);
            edit.commit();
        }        公共无效保存(字符串valueKey,长值){            共享preferences preFS = preferenceManager.getDefaultShared preferences(SingletonClass.applicationContext);
            共享preferences.Editor编辑= prefs.edit();
            edit.putLong(valueKey,值);
            edit.commit();
        }
    }

在gridview_item_Click,每当新的共享preferencesSupplication()保存(SingletonClass.keyIsFavSelected,假); 被调用时,应用程序崩溃和空指针异常在logcat中提出。我在哪里去了?


解决方案

从不使用在Android的语境静态引用,这将导致你一个重要的内存泄漏,因为环境已经给所有的应用程序资源引用

大多数的Andr​​oid UI类有一个动态的参考背景下,碎片可以做 getActivity(),在视图的getContext() 考虑使用这些替代方面单身

这个 更多信息/ p>

How to pass application context from Singleton class to SharedPreferences? I have a fragment and a GridView inside its onActivityCreated(Bundle savedInstanceState) method , on item-click, I am getting NullPointerException in logcat:

03-30 05:12:54.784: E/AndroidRuntime(1950): FATAL EXCEPTION: main
03-30 05:12:54.784: E/AndroidRuntime(1950): java.lang.NullPointerException
03-30 05:12:54.784: E/AndroidRuntime(1950):     at android.preference.PreferenceManager.getDefaultSharedPreferencesName(PreferenceManager.java:374)
03-30 05:12:54.784: E/AndroidRuntime(1950):     at android.preference.PreferenceManager.getDefaultSharedPreferences(PreferenceManager.java:369)
03-30 05:12:54.784: E/AndroidRuntime(1950):     at com.example.duaapp.utility.SharedPreferencesSupplication.save(SharedPreferencesSupplication.java:35)

Singleton Class

public class SingletonClass {

    public static Context applicationContext;

    public static int fontSizeMin = 17;
    public static int fontSizeMax = 35;

public static final String keySelVerseFromList = "keySelVerseFromList";
    public static final String keyFavVerses = "keyFavVerses";
    public static final String keyListOfVerses = "keyListOfVerses";

    public static final String keyIsFavSelected = "keyIsFavSelected";

}

SharedPreferences

  public class SharedPreferencesSupplication {


        public void save(String valueKey, String value) {

            SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(SingletonClass.applicationContext);
            SharedPreferences.Editor edit = prefs.edit();
            edit.putString(valueKey, value);
            edit.commit();
        }

        public void save(String valueKey, int value) {

            SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(SingletonClass.applicationContext);
            SharedPreferences.Editor edit = prefs.edit();
            edit.putInt(valueKey, value);
            edit.commit();
        }

        public void save(String valueKey, boolean value) {

            SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(SingletonClass.applicationContext);
            SharedPreferences.Editor edit = prefs.edit();
            edit.putBoolean(valueKey, value);
            edit.commit();
        }

        public void save(String valueKey, long value) {

            SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(SingletonClass.applicationContext);
            SharedPreferences.Editor edit = prefs.edit();
            edit.putLong(valueKey, value);
            edit.commit();
        }
    }

On gridview_item_Click, whenever new SharedPreferencesSupplication().save(SingletonClass.keyIsFavSelected, false); is called, the app crashes and nullpointer exception is raised in logcat. Where am I going wrong?

Never use static references to Context in Android, this will cause you an important memory leak since Context has references to all the application resources.

Most of the Android UI classes have a dynamic reference to the context, in fragments you can do getActivity(), in views getContext() consider using those instead of context singletons

More information about this here

这篇关于如何通过辛格尔顿和共享preferences类中的应用程序上下文的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆