我有一个带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.他们之间有什么区别?
非常感谢。
答案 0 :(得分:2)
唯一的区别是,使用getSherlockActivity ()
,您获得了getActivity()
的结果,但是将其作为SherlockActivity投放。这允许访问ABS特定的api。
如果您只需要一般性的内容,而不是Activity
类,请使用getActivity()
。它将突出显示这一点,否则突出显示您使用getSherlockActivity ()
使用ABS特定的内容。
NPE可以来自:
getActivity()
(或兄弟姐妹......)getActivity()
(或兄弟姐妹......)因此解决方案是在使用其活动之前检查您的片段是否已连接:
if( isAttached() ) {
getActivity()....
}
答案 1 :(得分:2)
NullPointerException是normally
警告:如果片段中需要Context对象,则可以调用getActivity()。但是,只有在片段附加到活动时才要小心调用getActivity()。当片段尚未附加,或在其生命周期结束时被分离时,getActivity()将返回null。
答案 2 :(得分:1)
此异常可能意味着当片段未附加到活动时,代码将被执行。
getSherlockActivity()返回的引用在附加Fragment时设置,然后在分离Fragment时清除(设置为null)。如果您的代码尝试在此之前或之后引用getSherlockActivity(),您将获得一个空指针。
答案 3 :(得分:0)
getSherlockActivity
只是一个快捷方式:
(SherlockActivity) getActivity()
因此,在您的情况下,在示例1中使用getActivity()
没有问题,但在示例2中它不起作用,因为它是SherlockActivity的方法。