在Android中的静态类中引用非静态方法 - getSharedPref

时间:2015-01-07 08:16:56

标签: android sharedpreferences static-members

我有以下代码:

  Context context = Activity.getApplicationContext();
             SharedPreferences settings = context.getSharedPreferences("AutoMsgSharedPrefs", MODE_PRIVATE);

            // Writing data to SharedPreferences
            SharedPreferences.Editor editor = settings.edit();
            editor.putString("key", "some value");
            editor.commit();

我一直在尝试使用SharedPrefs来存储 - “对话”类中给出的消息,如示例 - https://developer.android.com/samples/MessagingService/index.html。但是,如果我试图在“Conversation”类的构造函数中实现它,我就不能从静态类中引用非静态方法。那么如何解决这个问题?

如果按照建议更新,则以下是错误的屏幕截图:

enter image description here

4 个答案:

答案 0 :(得分:1)

要获取上下文,不需要使用Activity类。更改此代码

Context context = Activity.getApplicationContext();

Context context = getApplicationContext();

答案 1 :(得分:1)

说明:Activity类没有静态方法getApplicationContext(),因为这个方法是非静态的,所以你需要有一个对象实例。因此,在Activity on Context实例上调用此方法。

答案 2 :(得分:1)

这里

  

Context context = Activity.getApplicationContext();

此行不会返回有效的上下文,供您的应用程序调用{​​{1}}。

要从非Activity,Service,...类调用getSharedPreferences,您需要从应用程序组件传递有效的上下文,例如来自Activity,Service,..

要在getSharedPreferences中获取Context,请使用已在给定示例中创建的Conversation类构造函数,您需要再添加一个参数:

Conversation

现在使用Context mContext; public Conversation(int conversationId, String participantName, List<String> messages,Context mContext) { ..... this.mContext=mContext; } mContext类调用getSharedPreferences方法:

Conversation

答案 3 :(得分:1)

由于 @ρяσѕρєяK已经指出,您必须以某种方式授予您对Context实例的非Context类访问权限。例如,通过引入新参数

public Conversation(int conversationId, String participantName,
                            List<String> messages, Context context) {
            .....

        }

但请记住:

气馁保存对您的课程中Context s等长寿命和重量级组件的引用,因为此strong reference会排除context 垃圾收集,从而导致内存泄漏

所以而不是存储您的Context,您可以根据需要使用它来初始化您的Conversation对象,并让构造函数的范围处理丢弃短消息对Context的术语引用。 如果您需要多次Context,那么您可以编写一个方法,将Context实例作为参数并调用它来执行脏工作:

public void doStuff(Context context) {
          // do your work here
}