1

我在 Google Play 中有一堆痕迹,其中应用程序类的静态成员似乎为空。

我发现的所有相关帖子都是关于存储数据的,但这些变量不是数据,它们是 3rd 方 SDK 实例或其他与应用程序一起使用单例模式的关键对象。

类中使用的数据Activity存储在数据库中,并且没有使用静态引用。

这些痕迹根本不会报告给 Fabric,这很奇怪,因为它是在Application onCreate方法中初始化的。

跟踪表明FirebaseMessagingService onMessageReceived触发方法时静态变量为空,我需要将消息传递给 3rd 方 SDK,但由于该实例为空,因此应用程序崩溃。

仅在 Android OS 6.0 上看到的痕迹

有没有关于如何处理这个操作系统版本如此激进的归零静态成员的解决方案?

谢谢。

这是我使用的示例最低代码:

应用类:

@Override
public void onCreate() {
    Engine.init();
}

发动机类:

private static Engine sInstance;

private 3rdParty m3rdParty;

private Engine() {
    m3rdParty = new 3rdParty();
}

public static void init() {
    if (sInstance == null) {
        sInstance = new Engine();
    }
}

public static onMessageReceived(RemoteMessage remoteMessage) {
    sInstance.m3rdParty.onMessageReceived(remoteMessage);
    // Above line crashes with NPE, sEngine or m3rdParty is never set to null in code
}

扩展 FirebaseMessagingService:

public void onMessageReceived(RemoteMessage remoteMessage) {
    Engine.onMessageReceived(remoteMessage);
}
4

1 回答 1

3

有没有关于如何处理这个操作系统版本如此激进的归零静态成员的解决方案?

“操作系统”不是“使静态成员归零”。最有可能的是,您的进程被终止,无论是由于内存不足还是用户操作(例如,将您的任务从概览屏幕上滑出)。这是完全正常的。

我说“最有可能”,因为您的问题不包含堆栈跟踪和相关源代码的最小、完整和可验证的示例,因此我不能排除其他可能性。例如,如果您有代码在某些条件下分配null给这些static字段,那么在您不期望的情况下可能会满足这些条件。

于 2017-06-01T18:13:43.330 回答