android NewIntent上的活动空指针异常

zynd9foi  于 2023-03-11  发布在  Android
关注(0)|答案(3)|浏览(125)

我在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();
   }

这怎么可能呢?
编辑:我的活动的启动模式为SingleTask
编辑二:
我不能发送更多有用的日志,因为这个崩溃是在生产。只有我得到一些结构日志。
谢谢你的帮助,但我不能粘贴整个代码的隐私原因。
我想我在使用SingleTask-OnCreate-OnNewIntent时遇到了一个问题。简单地说,我正尝试从通知中打开我的应用,其中一个参数决定了当用户导航到Activity时将打开哪个片段。
您是否有任何包含SingleTask-OnCreate-OnNewIntent实现的示例?
感谢所有人的帮助。

busg9geu

busg9geu1#

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
来源二: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')中发生得更频繁,但仍然需要修复,因为这种情况仍然很少发生。

mwkjh3gx

mwkjh3gx2#

请记住生命周期,您可能会从未调用onCreate()的某个点返回Activity(例如,如果您在清单中设置了launchMode=singleTask或其他内容)。您可能会在onResume()中初始化/重新填充ArrayList,并检查它是否不为空,当您返回Activity时,会调用onResume()。

xxb16uws

xxb16uws3#

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

@Override
protected void onNewIntent(Intent intent) {

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

相关问题