2

FragmentInfo クラスに onReceive メソッドを実装しました。これは、コード内の別の場所からインテントが送信されたときに UI を更新する必要があるためです。このレシーバーは Fragment から登録しますが、Activity から登録する必要があるため、MainActivity から登録します。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

unregisterReceiver次のメソッドから呼び出してみてください。

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

onResume でブロードキャスト レシーバーを登録し、onPause で登録解除することをお勧めします。そのため、フラグメントがユーザーに表示されるたびにレシーバーが登録され、非表示になる (削除または別のフラグメントに置き換えられる) たびにレシーバーの登録が解除されます。

于 2014-03-20T08:07:59.383 に答える