代码之家  ›  专栏  ›  技术社区  ›  dev90

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

  •  -1
  • dev90  · 技术社区  · 8 年前

    我已经创建了一个库,并将其作为模块添加到我的应用程序中。我的图书馆没有 activity class ,所有类都是核心java类,因此我没有访问 context .

    这就是我所做的;

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

    我从第一个活动开始设置此上下文;

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

    那么我用这个 myGlobalContext 在所有的图书馆课程中。 当我调试这个时,它工作得很好 myGlobalContext 从不为null,但我从crashlytics得到一些崩溃 上下文 为空。

    Java语言lang.NullPointerException:尝试调用虚拟方法 'android。所容纳之物共享引用 安卓所容纳之物上下文GetSharedReferences(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 回复  |  直到 8 年前
        1
  •  1
  •   OneCricketeer Gabriele Mariotti    8 年前

    代替

    MyApplication.context = getApplicationContext();
    

    具有

    MyApplication.context = this;
    

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

    然而,如果您有一个核心Java库,则不应该使用应用程序,因为您没有生命周期方法可处理。只要定义使用上下文对象的方法,从外部导入库,并且如果您实际在活动、服务或其他上下文子类中,就可以节省使用应用程序上下文

        2
  •  1
  •   Simon Pasku    8 年前

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