我有以下代码:
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”类的构造函数中实现它,我就不能从静态类中引用非静态方法。那么如何解决这个问题?
如果按照建议更新,则以下是错误的屏幕截图:
答案 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
}