Activity onNewIntent 空指针异常
Activity onNewIntent Null Pointer Exception
我在 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();
}
怎么可能?
编辑:我的 Activity 的启动模式是 SingleTask
编辑 2:
我无法发送更多有用的日志,因为此崩溃正在生产中。只有我得到一些织物原木。
感谢您的帮助,但由于隐私原因我无法粘贴整个代码。
我想我对 SingleTask-OnCreate-OnNewIntent 的使用有疑问。只是我试图从通知中打开我的应用程序,参数决定了当用户导航到 activity.
时将打开哪个片段
您是否有任何包含 SingleTask-OnCreate-OnNewIntent 实现的示例?
感谢大家的帮助。
如果您在 onNewIntent()
方法中得到 NullPointerException
那么可能 filtered
对象是空的。
试试这个方法
@Override
protected void onNewIntent(Intent intent) {
//Check for null value and then proceed.
if(filtered != null)
filtered.clear();
}
牢记生命周期,也许您正在 return 从未调用 onCreate() 的某个点访问您的 Activity(例如,如果您设置了 launchMode=singleTask 或你的清单)。也许 initialize/repopulate 你在 onResume() 中的 ArrayList 并检查它是否不为空,当你 return 到你的 Activity.
时,肯定会调用 on Resume()
Open Whisper Systems 的团队遇到了同样的问题:
https://github.com/WhisperSystems/Signal-Android/issues/2971
他们认为这是由 Android 框架在 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
更新: 2017 年 11 月 10 日:在 app/build 中 升级构建工具 时,这个问题似乎很少发生.gradle:
buildToolsVersion '25.0.2'
使用较旧的构建工具(例如 buildToolsVersion '23.0.3'
)似乎更常发生这种情况,但仍然需要修复,因为它仍然在极少数情况下发生。
我在 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();
}
怎么可能?
编辑:我的 Activity 的启动模式是 SingleTask
编辑 2:
我无法发送更多有用的日志,因为此崩溃正在生产中。只有我得到一些织物原木。
感谢您的帮助,但由于隐私原因我无法粘贴整个代码。
我想我对 SingleTask-OnCreate-OnNewIntent 的使用有疑问。只是我试图从通知中打开我的应用程序,参数决定了当用户导航到 activity.
时将打开哪个片段您是否有任何包含 SingleTask-OnCreate-OnNewIntent 实现的示例?
感谢大家的帮助。
如果您在 onNewIntent()
方法中得到 NullPointerException
那么可能 filtered
对象是空的。
试试这个方法
@Override
protected void onNewIntent(Intent intent) {
//Check for null value and then proceed.
if(filtered != null)
filtered.clear();
}
牢记生命周期,也许您正在 return 从未调用 onCreate() 的某个点访问您的 Activity(例如,如果您设置了 launchMode=singleTask 或你的清单)。也许 initialize/repopulate 你在 onResume() 中的 ArrayList 并检查它是否不为空,当你 return 到你的 Activity.
时,肯定会调用 on Resume()Open Whisper Systems 的团队遇到了同样的问题:
https://github.com/WhisperSystems/Signal-Android/issues/2971
他们认为这是由 Android 框架在 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
更新: 2017 年 11 月 10 日:在 app/build 中 升级构建工具 时,这个问题似乎很少发生.gradle:
buildToolsVersion '25.0.2'
使用较旧的构建工具(例如 buildToolsVersion '23.0.3'
)似乎更常发生这种情况,但仍然需要修复,因为它仍然在极少数情况下发生。