Activity onNewIntent 空指针异常

Activity onNewIntent Null Pointer Exception

我在 activity onCreate() 中初始化我的列表,如下所示:

private List<MyItem> filtered;
@Override
   protected void onCreate(@Nullable Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.activity_dashboard);
      filtered = new ArrayList<>();

      // more things
}

当我尝试使用来自 onNewIntent 的筛选项时,有时会出现空指针异常。

 @Override
   protected void onNewIntent(Intent intent) {
      super.onNewIntent(intent);
      filtered.clear();
   }

怎么可能?

编辑:我的 Activity 的启动模式是 SingleTask

编辑 2:

我无法发送更多有用的日志,因为此崩溃正在生产中。只有我得到一些织物原木。

感谢您的帮助,但由于隐私原因我无法粘贴整个代码。

我想我对 SingleTask-OnCreate-OnNewIntent 的使用有疑问。只是我试图从通知中打开我的应用程序,参数决定了当用户导航到 activity.

时将打开哪个片段

您是否有任何包含 SingleTask-OnCreate-OnNewIntent 实现的示例?

感谢大家的帮助。

如果您在 onNewIntent() 方法中得到 NullPointerException 那么可能 filtered 对象是空的。

试试这个方法

@Override
protected void onNewIntent(Intent intent) {

   //Check for null value and then proceed. 
   if(filtered != null)
      filtered.clear();
} 

牢记生命周期,也许您正在 return 从未调用 onCreate() 的某个点访问您的 Activity(例如,如果您设置了 launchMode=singleTask 或你的清单)。也许 initialize/repopulate 你在 onResume() 中的 ArrayList 并检查它是否不为空,当你 return 到你的 Activity.

时,肯定会调用 on Resume()

Open Whisper Systems 的团队遇到了同样的问题:

https://github.com/WhisperSystems/Signal-Android/issues/2971

他们认为这是由 Android 框架在 onCreate() 之后不久调用 onNewIntent() 引起的,即使您从 onCreate() 中调用 finish()。这最终导致 null 个对象在 onNewIntent() 中使用,然后在 NullPointerException 中使用,因为这些对象没有在通常的 onCreate() 中设置。这似乎是 onCreate()onNewIntent() 之间的罕见情况或竞争条件。

他们似乎已经通过检查 onNewIntent() 中的 isFinishing() 来修复它,以防止 onNewIntent() 继续:

@Override
protected void onNewIntent(Intent intent) {
    Log.w(TAG, "onNewIntent()");

    if (isFinishing()) {
        Log.w(TAG, "Activity is finishing...");
        return;
    }
    ...
}

来源 1:https://github.com/SilenceIM/Silence/commit/c0acae1124c0c066fd961d21d3ec9b989574125d

来源 2:https://github.com/SilenceIM/Silence/blob/master/src/org/smssecure/smssecure/ConversationActivity.java#L223


更新: 2017 年 11 月 10 日:在 app/build 中 升级构建工具 时,这个问题似乎很少发生.gradle:

buildToolsVersion '25.0.2'

使用较旧的构建工具(例如 buildToolsVersion '23.0.3')似乎更常发生这种情况,但仍然需要修复,因为它仍然在极少数情况下发生。