我在我的活动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
编辑2:
我无法发送更多有用的日志,因为此崩溃正在生产中。只有我得到一些织物日志。
感谢您的帮助,但我无法粘贴整个代码隐私原因。
我认为我在使用SingleTask-OnCreate-OnNewIntent时遇到问题。我只是试图通过通知打开我的应用程序,并通过参数决定当用户导航到活动时将打开哪个片段。
你有关于这个包含SingleTask-OnCreate-OnNewIntent实现的任何例子吗?
感谢所有人的帮助。
答案 0 :(得分:2)
Open Whisper Systems的团队遇到了同样的问题:
https://github.com/WhisperSystems/Signal-Android/issues/2971
他们认为,即使您从onNewIntent()
内拨打onCreate()
,我们也会在finish()
后很快就调用onCreate()
的Android框架引起这种情况。这最终导致在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
更新: 2017年11月10日:在app / build.gradle中升级构建工具时,这个问题似乎发生得少得多:
buildToolsVersion '25.0.2'
似乎更频繁地使用较旧的构建工具,例如buildToolsVersion '23.0.3'
,但仍然需要修复,因为它仍然会在极少数情况下发生。
答案 1 :(得分:1)
请记住生命周期,也许您从某些未调用onCreate()的位置返回Activity(例如,如果您在清单中设置了launchMode = singleTask或其他内容)。也许在onResume()中初始化/重新填充你的ArrayList,并检查它是否为null,在返回你的Activity时肯定调用Resume()。
答案 2 :(得分:0)
如果您在NullPointerException
方法中获得onNewIntent()
,则可能filtered
对象为空。
试试这种方式
@Override
protected void onNewIntent(Intent intent) {
//Check for null value and then proceed.
if(filtered != null)
filtered.clear();
}