Android Studio上下文返回null

时间:2018-03-24 16:43:09

标签: android null android-context

我有一个类正在向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?

4 个答案:

答案 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