如何在不使用静态上下文的情况下将上下文传递给模块类?

时间:2018-01-10 07:58:10

标签: android nullpointerexception sharedpreferences

我创建了一个库,并在我的应用中添加为模块。我的库没有任何activity class,所有类都是核心java类,所以我无法访问context

这就是我所做的;

  • 我的图书馆课程是singleton
  • 我创建了一个这样的静态变量; static Context myGlobalContext
  • 我创建了一个设置此上下文的方法;
 public void init(Context context){ 
        myGlobalContext=context;
}

我从第一个活动中设置了这个上下文;

    MyClass.sharedInstance().init(MyApplication.getAppContext());

然后我在所有库类中使用此myGlobalContext。 当我调试它时,这个东西工作正常,myGlobalContext的值永远不会为空,但是我遇到崩溃的崩溃,其中context为空。

  

java.lang.NullPointerException:尝试调用虚方法   “android.content.SharedPreferences   android.content.Context.getSharedPreferences(java.lang.String,int)'   在空对象引用上

当我运行lint时,它还会警告static global context

这是我的application class,这里我创建了上下文;

public class MyApplication extends Application {

    private static Context context;

    public void onCreate() {
        super.onCreate();
        MyApplication.context = getApplicationContext();
}

  public static Context getAppContext() {
        return MyApplication.context;
    }

2 个答案:

答案 0 :(得分:1)

根据您的代码,您应该至少有一个MyApplication实例,或者只是将一些默认数据设置为MyApplication.context,然后您的静态getAppContext将返回一些值

答案 1 :(得分:1)

替换

MyApplication.context = getApplicationContext();

MyApplication.context = this;

您需要将应用程序名称添加到清单中,以便设置此上下文

但是,如果您有一个核心Java库,则不应该使用Application,因为您没有生命周期方法可以处理。只需定义使用Context对象的方法,从外部导入库,并在实际处于Activity,Service或其他Context子类中时谨慎使用Application Context