【问题标题】:How to get Context from Kotlin file in Java file?如何从 Java 文件中的 Kotlin 文件中获取上下文?
【发布时间】:2021-11-22 15:19:30
【问题描述】:

我的应用程序类是使用 Kotlin 开发的(我使用 Dagger2)。在用 Java 编写的类中,我需要传递 Context,但我得到一个空指针异常。如何获取上下文?

我的应用程序类:

class App : DaggerApplication() {

    override fun applicationInjector(): AndroidInjector<out DaggerApplication> {
        return DaggerAppComponent.factory().create(this)
    }

}

我的 Java 方法:

public class NotificationUtil {
private static NotificationUtil instance;

    public NotificationUtil() {
    }

    public static synchronized NotificationUtil getInstance() {
        if (instance == null)
            return new NotificationUtil();
        return instance;
    }

    public void postNotificationSpam(StatusBarNotification sbn, int numberNotify) {
            Context context = new App().getApplicationContext();
            NotificationCompat.Builder ncb;
            NotificationManager nm = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
    }
}

我正在尝试像这样在 Activity 中调用方法:

NotificationUtil.getInstance().postNotificationSpam(lstNotify.get(0).barNotification, lstNotify.size());

我的错误代码:

java.lang.NullPointerException: Attempt to invoke virtual method 'android.content.Context android.content.Context.getApplicationContext()' on a null object reference
        at android.content.ContextWrapper.getApplicationContext(ContextWrapper.java:109)
        at com.package.cleanapp.service.NotificationUtil.postNotificationSpam(NotificationUtil.java:204)

【问题讨论】:

  • 方法在哪里?在一个活动中还是什么
  • 这是一个公共 NotificationUtil 类

标签: java android kotlin dagger-2 android-context


【解决方案1】:

您正在使用 new App().getApplicationContext();。不要使用它。因为您的应用已打开,但尚未初始化。您可以使用 this

【讨论】:

  • 我不能用这个,它需要在一个Activity中才能做到这一点。
  • 那么方法在哪里
  • 必需类型:上下文提供:NotificationUtil
【解决方案2】:

我通过构造函数传递上下文解决了这个问题

public void postNotificationSpam(Context context, StatusBarNotification sbn, int numberNotify) {
            NotificationCompat.Builder ncb;
            NotificationManager nm = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
    }

活动中:

NotificationUtil.getInstance().postNotificationSpam(this, lstNotify.get(0).barNotification, lstNotify.size());

【讨论】:

  • 如果您已经在使用 dagger,您可以考虑将其转换为应用程序范围的单例并注入应用程序上下文。无需维护自己的实例或以这种方式传递上下文
  • 看我的问题,无论我如何尝试嵌入上下文,我总是得到一个空指针异常。
猜你喜欢
  • 1970-01-01
  • 2017-03-06
  • 1970-01-01
  • 1970-01-01
  • 2011-07-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多