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