我有一个类,它将一些数据输入到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?
这是因为MainActivity.getContext()
null
尝试将上下文从MainActivity 传递到您的类。
public Context context;
public YourClass(Context context) {
this.context= context;
}
在主活动中,像这样初始化它:-
YourClass yours = new YourClass(MainActivity.this);
并且还要避免使用可能导致内存泄漏的静态上下文!
上下文是一个抽象类,其实现由 安卓系统
上下文在运行时由 android 系统提供给任何Activity
(Activity
间接扩展Context
)。您正在尝试通过静态方法从类中获取Context
MainActivity
该方法将不起作用,并且将始终返回null
:
context = MainActivity.getContext();
你应该总是从Activity
的实例中获取Context
,而不是类本身。通过将当前 Activity 的实例传递给类的构造函数,可以轻松完成此操作。然后,在该Activity
的实例上调用getContext()
,而不是Activity
类本身。
另外,想提一下,您的代码主要是反模式的。切勿将上下文存储在静态变量中。我建议您阅读更多关于 android 中的活动生命周期和上下文 - 这些都是基础知识。
您可以在整个应用程序中
静态获取上下文,请尝试以下代码:
在 Android 清单文件中,声明以下内容。
<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() 来静态获取应用程序上下文。
您从类中的静态方法获取上下文,这意味着该方法在实际初始化类之前被调用。如果没有活动的实际实例,或者 OS 未提供活动的上下文,则为 null。活动可以访问上下文,但在 Android 下划线管理初始化它之后,该类本身不会有上下文,因为它就在那里,如果你注意到 Activity 永远不会使用构造函数实例化,因为 Android 会为你做这件事。
如果要使用静态方法来获得良好的语法,则静态方法应位于使用共享首选项的类中,并且应在活动生命周期的任何方法期间或用户与 UI 交互时从活动传递(这些侦听器在活动生命周期上设置)。
class MyPreferences {
static void save(String toSave, Contex context) {
//TODO your operation here
}
}
和您的活动:
public class MainActivity extends AppCompatActivity {
//Below is pseudo code, be careful on doing this precisely in the activity
@Override
onCreate() {
//TODO call super and setContentView
MyPreferences.save("foo", this);
}
}
似乎您的问题是您正在尝试使其他类使用活动,但在Android中是使用其他类的活动