Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/178.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 如何在片段内部的OnServiceConnectiond中避免getActivity()==null?_Android_Android Fragments_Android Service - Fatal编程技术网

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
,否则你会搞砸。我会投票支持“改变整个概念”“。我不喜欢绑定服务,因为它引入了太多的状态和紧密耦合。我宁愿通过事件总线建立事件驱动的通信。