Android 如何在片段内部的OnServiceConnectiond中避免getActivity()==null?
我使用以下方法在片段中绑定服务:Android 如何在片段内部的OnServiceConnectiond中避免getActivity()==null?,android,android-fragments,android-service,Android,Android Fragments,Android Service,我使用以下方法在片段中绑定服务: private ServiceConnection mConn = new ServiceConnection() { public void onServiceConnected(ComponentName className, IBinder service) { //HOW CAN I AVOID THIS BEING NULL??? if(getActivity() == null) System.o
private ServiceConnection mConn = new ServiceConnection() {
public void onServiceConnected(ComponentName className, IBinder service) {
//HOW CAN I AVOID THIS BEING NULL???
if(getActivity() == null)
System.out.println("NOT HAPPY:(((");
}
}
这意味着您的代码在附加片段之前被调用 试试这个:
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
mActivity = activity;
}
我确实喜欢这个。。。
在应用程序类中,我曾经编写这个getter和setter来获取活动上下文
private static Context mContext;
public static Context getCurrentActivityContext() {
return mContext;
}
public static void setCurrentACtivityContext(Context context) {
mContext = context;
}
我将从所有活动onCreate()、onResume()和onStart()调用setter。
我将从片段调用getter来获取上下文对象。
我可以说这将对你的情况有所帮助,你不会得到任何NPE。好吧,你不能保证它不会为
null
。如果在调用onServiceConnected()
之前将片段与活动分离,getActivity()
将返回null
。分离可能由于配置更改、活动破坏或特定的片段事务而发生。您可能需要重新考虑是否确实需要绑定到服务,或者是正确的解决方案。为什么不能在创建的活动中编写on serviceconnected
代码<代码>onActivityCreated
在创建片段的活动时被调用,因此getActivity()
将不会null
。以这种方式保留数据成员中的活动没有价值,也没有明确的潜在成本(以潜在内存泄漏的形式),这取决于片段的其余部分是如何设置的。好的,但是关于片段始终保留其父活动的引用并通过getActivity()方法使您可用的语句呢?在这里,我们保留该参考资料。没别的了。此外,谷歌建议这样做,创建活动的事件回调”(几个月前,当我遇到类似问题时,我在上面发现了这个)。除了在onDetach()
中不显示将mActivity
设置为null
之外,没有其他内容。”。如果不这样做,可能会导致内存泄漏,特别是在保留的片段中。如果在onDetach()
中将其设置为null
,则是在复制getActivity()
,浪费了约4字节的堆和几行代码,没有任何附加值。“谷歌建议这样做”--在他们的情况下,他们不只是保留活动,而是将其转换到一个界面,从而增加了增量值。然而,他们也搞砸了,没有显示ondeach()
并释放它们的引用,因此我将为此提交一份错误报告。无论如何,这些都不能解决OP的问题,因为如果getActivity()
返回null
,mActivity
最好也为null
,否则你会搞砸。我会投票支持“改变整个概念”“。我不喜欢绑定服务,因为它引入了太多的状态和紧密耦合。我宁愿通过事件总线建立事件驱动的通信。