8

我在我的活动 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 的使用有问题。只是我试图从通知中打开我的应用程序,参数决定当用户导航到活动时将打开哪个片段。

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

感谢大家的帮助。

4

3 回答 3

2

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

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

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

他们似乎已经通过签isFinishing()入来修复它onNewIntent()以防止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'.

于 2017-03-20T21:52:28.463 回答
1

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

于 2015-09-24T09:20:52.960 回答
0

如果您正在获取方法NullPointerExceptiononNewIntent()那么filtered对象可能为空。

试试这个方法

@Override
protected void onNewIntent(Intent intent) {

   //Check for null value and then proceed. 
   if(filtered != null)
      filtered.clear();
} 
于 2015-09-24T09:19:12.827 回答