Android 要使用getSherlockActivity()或getActivity()或其他?
我有一个带TabManager的Android应用程序。由于Android API的更改,我需要升级我的应用程序以使活动包含该片段。为了提供向后兼容性,我使用ActionBarSherlock 我的应用程序运行良好。然而,看看Google Play开发者控制台,在getSherlockActivity()线上总是很少有关于“java.lang.NullPointerException”的崩溃报告,我认为只有不到0.1%的用户受到影响 比如说,Android 要使用getSherlockActivity()或getActivity()或其他?,android,actionbarsherlock,Android,Actionbarsherlock,我有一个带TabManager的Android应用程序。由于Android API的更改,我需要升级我的应用程序以使活动包含该片段。为了提供向后兼容性,我使用ActionBarSherlock 我的应用程序运行良好。然而,看看Google Play开发者控制台,在getSherlockActivity()线上总是很少有关于“java.lang.NullPointerException”的崩溃报告,我认为只有不到0.1%的用户受到影响 比如说, // Example 1 File file
// Example 1
File file = new File(getSherlockActivity().getCacheDir(), "filename");
// Example 2
getSherlockActivity().setSupportProgressBarIndeterminateVisibility(false);
我的问题:
1.我是否应该将所有getSherlockActivity()更改为getActivity()?或者在某些规则下,必须使用其中一种?
2.他们之间有什么区别
非常感谢。唯一的区别是使用
getSherlockActivity()
可以获得getActivity()
的结果,但被铸造为SherlockActivity。这允许访问ABS特定的API
如果您只需要在Activity
类中使用足够通用的内容,只需使用getActivity()
。它将突出显示这一点,否则将突出显示这样一个事实,即使用getSherlockActivity()
使用特定于ABS的内容
NPE可以来自:
- 在执行onAttach之前使用
(或同级…)getActivity()
- 在执行OnDetch后使用
(或同级…)getActivity()
if( isAttached() ) {
getActivity()....
}
此异常可能意味着代码在片段未附加到活动时正在执行 getSherlockActivity()返回的引用在附加片段时设置,然后在分离片段时清除(设置为null)。如果代码在此之前或之后尝试引用getSherlockActivity(),则会得到一个空指针。 NullPointerException是 注意:如果片段中需要上下文对象,可以调用getActivity()。但是,请注意仅当片段附加到活动时才调用getActivity()。当片段尚未附加或在其生命周期结束时被分离时,getActivity()将返回null
getSherlockActivity
只是一个快捷方式:
(SherlockActivity) getActivity()
因此,在您的情况下,在示例1中使用
getActivity()
没有问题,但在示例2中它将不起作用,因为它是SherlockActivity的一种方法。低错误率告诉我,这可能是您的活动被破坏(暂停)的症状由于资源限制由操作系统创建,然后在用户返回操作系统但未正确还原时重新创建(通常是因为未正确保存活动状态)。您可以通过打开开发者选项“不保留活动”来测试这一点,然后在您的活动和另一个应用程序之间切换,然后再次切换。我发现打开它可以帮助我完成大部分的开发/测试工作,它可以清除死机报告到达之前你不会注意到的角落案例。谢谢大家。在活动被销毁后(按“上一步”按钮),成功纠正了由于onPostExecute导致的问题。但是我想知道为什么片段进程仍然可以运行,因为它的活动已经被销毁了?那是因为AsyncTask就是异步的,并且已经超出了启动它的活动(或片段)。引用developer.android.com的话——“AsyncTasks最好用于短期操作”。如果在活动被破坏之前任务还没有完成,我会说它太长了。AsyncTask JavaDoc为长时间运行的后台任务提供了替代方法。本质上,AsyncTask是为了从UI线程中去掉“真正的工作”,并停止UI感觉滞后。