我有一个类正在向SharedPreferences输入一些数据。
private static Context context;
context = MainActivity.getContext();
sp = (SharedPreferences) context.getSharedPreferences("currentData", Context.MODE_PRIVATE).edit();
SharedPreferences.Editor editor = sp.edit();
editor.putString("name", placeName);
editor.apply()
我使用MainActivity类中的方法设置上下文:
public static Context getContext(){
return context;
}
但是我一直得到一个空对象引用。从堆栈溢出中尝试了多个解决方案并且无法解决问题。
为什么上下文返回null?
答案 0 :(得分:1)
Context是一个抽象类,其实现由 Android系统
在运行时期间由android系统向任何Activity
提供上下文(Activity
间接扩展Context
)。您正尝试通过静态方法从Context
类获取MainActivity
,这将无效并将始终返回null
:
context = MainActivity.getContext();
您应始终从Context
的实例获取Activity
,而不是类本身。您可以通过将当前Activity的实例传递给类的构造函数来轻松完成此操作。然后,您在getContext()
的实例上调用Activity
,而不是Activity
类本身。
另外,想提一下你的代码主要是反模式的。您永远不应该将Context存储在静态变量中。我建议你阅读更多关于android和Context中的Activity生命周期 - 这些都是基础知识。
答案 1 :(得分:1)
您可以在整个申请中静态获取上下文
请尝试以下代码:
在Android Manifest文件中,声明以下内容。
<application android:name="com.xyz.MyApplication">
</application>
使用此课程
public class MyApplication extends Application {
private static Context context;
public void onCreate() {
super.onCreate();
MyApplication.context = getApplicationContext();
}
public static Context getAppContext() {
return MyApplication.context;
}
}
现在,您可以调用MyApplication.getAppContext()来静态获取应用程序上下文。
答案 2 :(得分:0)
这是因为MainActivity.getContext()
null
尝试将从 MainActivity传递给您的班级。
public Context context;
public YourClass(Context context) {
this.context= context;
}
在MainActivity中,init就像这样: -
YourClass yours = new YourClass(MainActivity.this);
还避免使用静态上下文,这可能会导致内存泄漏 !!
答案 3 :(得分:0)
您正在从类中的静态方法获取上下文,这意味着在实际初始化类之前调用该方法。如果没有活动的实际实例,或者操作系统没有为活动提供上下文,则为null。 Activity可以访问上下文但是在Android下划线管理初始化后,该类不会自己拥有上下文,因为它存在,如果你注意到Activity永远不会使用构造函数实例化,因为Android会为你做
如果你想使用静态方法来获得一个好的语法,那么静态方法应该在使用共享prefferences的类中,并且应该在acyivity中,在Activity生命周期的任何方法中或者在用户时传递与ui交互(那些听众是在Acticity生命周期中设置的)。
class MyPrefferences {
static void save(String toSave, Contex context) {
//TODO your operation here
}
}
您的活动:
public class MainActivity extends AppCompatActivity {
//Below is pseudo code, be carefull on doing this precesily in the activity
@Override
onCreate() {
//TODO call super and setContentView
MyPrefferences.save("foo", this);
}
}
看来你的问题是你试图让其他类使用Activity,但在Android中是使用其他类的Activity