Android Studio 上下文返回 null



我有一个类,它将一些数据输入到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)。您正在尝试通过静态方法从类中获取ContextMainActivity该方法将不起作用,并且将始终返回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中是使用其他类的活动

相关内容

  • 没有找到相关文章

最新更新