Android 要使用getSherlockActivity()或getActivity()或其他?

Android 要使用getSherlockActivity()或getActivity()或其他?,android,actionbarsherlock,Android,Actionbarsherlock,我有一个带TabManager的Android应用程序。由于Android API的更改,我需要升级我的应用程序以使活动包含该片段。为了提供向后兼容性,我使用ActionBarSherlock 我的应用程序运行良好。然而,看看Google Play开发者控制台,在getSherlockActivity()线上总是很少有关于“java.lang.NullPointerException”的崩溃报告,我认为只有不到0.1%的用户受到影响 比如说, // Example 1 File file

我有一个带TabManager的Android应用程序。由于Android API的更改,我需要升级我的应用程序以使活动包含该片段。为了提供向后兼容性,我使用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.他们之间有什么区别


非常感谢。

唯一的区别是使用
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感觉滞后。