活动onNewIntent空指针异常



我在我的活动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的launchmode是SingleTask

编辑2:

我不能发送更多有用的日志,因为这个崩溃是在生产中。我只找到了一些织物原木。

谢谢你的帮助,但我不能粘贴整个代码的隐私原因。

我想我有一个问题在singlettask - oncreate - onnewintent的使用。简单地说,我试图打开我的应用程序从通知与参数决定哪个片段将被打开,当用户导航到活动。

你有关于这个包含singlettask - oncreate - onnewintent实现的例子吗?

感谢大家的帮助。

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

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

他们认为这是由Android框架中的一个bug引起的,当它在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/0b4ea2412273f4e4918cff8f304380d3151ff6d4/src/org/smssecure/smssecure/ConversationActivity.java#L225-L249


更新: 2017年11月10日:当升级app/build.gradle中的构建工具时,此问题似乎发生的频率要低得多:

buildToolsVersion '25.0.2'

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

记住生命周期,也许你是从onCreate()不被调用的某个点返回到你的Activity(例如,如果你已经设置了launchMode=singleTask或你的清单中的东西)。也许在onResume()中初始化/重新填充你的ArrayList,并检查它是否不为空,在Resume()上被调用,当你返回到你的Activity

如果您在onNewIntent()方法中获得NullPointerException,则可能filtered对象为空。

试试这个

@Override
protected void onNewIntent(Intent intent) {
   //Check for null value and then proceed. 
   if(filtered != null)
      filtered.clear();
} 

相关内容

  • 没有找到相关文章