2

我在 FragmentInfo 类中实现了 onReceive 方法,因为当意图从我的代码中的其他地方发送时,我需要更新 UI。我从 Fragment 注册这个接收器,但从 MainActivity 注册,因为它必须从 Activity 注册。我不知道在哪里放置 unregisterReceiver 调用,所以我的程序崩溃了。我收到错误:

MainActivity 泄露了最初在这里注册的 IntentReceiver FragmentInfo。您是否错过了对 unregisterReceiver() 的调用?

我试图从 MainActivity onPause 方法调用 unregisterReceiver,就像通常所做的那样,但是从 MainActivity 我无法访问 mBroadcastReceiver。我该如何解决这个问题?

public class FragmentInfo extends Fragment {

    //nested class BroadcastReceiver
    private BroadcastReceiver mBroadcastReceiver = new BroadcastReceiver() {

        //from there we must update FragmentInfo UI
        @Override
        public void onReceive(Context context, Intent intent) {
            //updateFragmentInfo(intent);
            updateUiInfo();
            //unregisterReceiver
        ((MainActivity)getActivity()).unregisterReceiver(mBroadcastReceiver);
        }
    };

    private TextView textView3;
    private TextView textView5;
    private TextView textView7;
    private TextView textView8;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {     
        //dynamic register BroadcastReceiver, for triggering intent when BT connection is established
        //BroadcastReceiver can be registered static in ManifestFile
        IntentFilter mIntentFilter = new IntentFilter();
        //register message 
        mIntentFilter.addAction("bluetooth_established_intent");
        //we must call registerReceiver from MainActivity!
        ((MainActivity)getActivity()).registerReceiver(this.mBroadcastReceiver,mIntentFilter);
    }
}

编辑:我在调用 updateUIInfo 后取消注册接收器,它现在可以工作了。我在代码中编辑。

4

4 回答 4

0

好的做法是在 onResume 中注册广播接收器并在 onPause 中取消注册。因此,每次片段对用户可见时,它都会注册接收器,并且每次它变得不可见(删除或替换为另一个片段)时,它都会取消注册接收器。

于 2014-03-20T08:07:59.383 回答
0

尝试unregisterReceiver从以下方法调用:

@Override
public void onDestroyView() {
    super.onDestroyView();
}
于 2015-07-21T08:04:47.510 回答
0

我设法最终以这种方式解决了泄漏:

LocalBroadcastManager.getInstance(getActivity()).unregisterReceiver(YOUR_RECEIVER_HERE);

因为通过做

getActivity().unregisterReceiver(...) 

或者

getContext().unregisterReceiver(...)

在两者中onPause()onStop()没有帮助。

于 2016-09-05T13:43:10.280 回答
-1

您将在 Fragment 中调用unregisterReceiverfromonPause方法。

于 2013-07-26T07:39:13.363 回答