【发布时间】:2013-06-06 17:25:13
【问题描述】:
我有一个带有 TabManager 的 Android 应用。由于 Android API 的更改,我需要升级我的应用程序以使 Activity 包含 Fragment。为了提供向后兼容性,我使用 ActionBarSherlock。
我的应用程序运行良好。但是,查看 Google Play 开发者控制台,总是很少有关于 getSherlockActivity() 行的“java.lang.NullPointerException”的崩溃报告,我认为只有不到 0.1% 的用户受到影响。
例如,
// Example 1
File file = new File(getSherlockActivity().getCacheDir(), "filename");
// Example 2
getSherlockActivity().setSupportProgressBarIndeterminateVisibility(false);
我的问题: 1.我应该把所有的getSherlockActivity()都改成getActivity()吗?还是在某些规则下,必须使用其中之一? 2. 它们有什么区别?
非常感谢。
【问题讨论】:
-
低错误率告诉我,这可能是您的活动因资源限制而被操作系统破坏(同时暂停),然后在用户返回时重新创建但没有正确恢复(通常是因为活动状态未正确保存)。您可以通过打开开发人员选项“不保留活动”来测试这一点,然后在您的活动和另一个应用程序之间切换,然后再返回。我发现在打开它的情况下完成我的大部分开发/测试工作很有帮助,它会清除在崩溃报告到达之前您不会注意到的极端情况。
-
谢谢大家。设法纠正在 Activity 被销毁(按返回按钮)后由于 AsyncTask 的 onPostExecute 引起的问题。但是我想知道为什么 Fragment 进程仍然可以运行,因为它的 Activity 已经被销毁了?
-
那是因为 AsyncTask 就是这样 - 异步的 - 并且已经超出了启动它的 Activity(或 Fragment)。引用 developer.android.com - “AsyncTasks 应该理想地用于短操作”。如果在活动被破坏之前任务还没有完成,我会说它太长了。 AsyncTask JavaDoc 为长时间运行的后台任务建议了替代方法。从本质上讲,AsyncTask 可以从 UI 线程中移除“真正的工作”并阻止 UI 感觉滞后。