Search code examples
androidconnectionbroadcastreceiver

Failed to involve interface method null object reference in my listener and broadcast receiver


Maybe my title of question have some others on stackoverflow, but I can not find any helpful info, so I need anyone help the particular problem of mine: I want to check Internet connection continuously, so I created a broadcast receiver extends class and it has listener as below:

NetworkStateReceiver.java:

public class NetworkStateReceiver extends BroadcastReceiver {

    public interface NetworkStateListener {
        void onNetChange(int status);
    }

    private NetworkStateListener mOnNetworkStateListener;

    public void setNetworkStateListener(NetworkStateListener listener) {
        mOnNetworkStateListener = listener;
    }

    public void onReceive(Context context, Intent intent) {
        int status = NetworkUtil.getConnectivityStatus(context);
        if (mOnNetworkStateListener != null)
            mOnNetworkStateListener.onNetChange(status);
    }
}

in My Activity:

public class FrgChoosing extends Fragment {
    private NetworkStateReceiver mNetworkStateCallback;
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {   
        ...
        initNetworkChecking();
    } 
    private void initNetworkChecking() {
        mNetworkStateCallback = new NetworkStateReceiver();
        mNetworkStateCallback.setNetworkStateListener(new NetworkStateListener() {      
            @Override
            public void onNetChange(int status) {
                // TODO Auto-generated method stub
                switch (status) {
                case NetworkUtil.TYPE_WIFI:
                    Functions.toastString("have wifi connection", getActivity());
                    break;
                case NetworkUtil.TYPE_MOBILE:
                    Functions.toastString("have 3g connection", getActivity());
                    break;
                case NetworkUtil.TYPE_NOT_CONNECTED:
                    Functions.toastString("no connection", getActivity());
                    break;
                default:
                    break;
                }
            }
        });
    }
}

in Manifest:

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
...
<receiver android:name=".NetworkStateReceiver">
    <intent-filter>
        <action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
        <action android:name="android.net.wifi.WIFI_STATE_CHANGED" />
    </intent-filter>
</receiver>

And after see logcat, I believe mOnNetworkStateListener always null when NetworkStateReceiver.onReceiver is triggered. I don't know where the error? Anyone can help me resolve this problem? Thanks in advance everyone.


Solution

  • You need Register the broadcast receiver. Fully FrgChoosing:

        private void initNetworkChecking() {
            // TODO Auto-generated method stub
            if (!Functions.hasConnection(getActivity())) {
                Functions.toastString(getActivity().getResources().getString(R.string.alert_no_internet), getActivity());
            }
            mNetworkStateCallback = new NetworkStateReceiver();
            mNetworkStateCallback.setNetworkStateListener(new NetworkStateListener() {      
                @Override
                public void onNetChange(int status) {
                    // TODO Auto-generated method stub
                    switch (status) {
                    case NetworkUtil.TYPE_WIFI:
                        Functions.toastString("co mang wifi", getActivity());
                        break;
                    case NetworkUtil.TYPE_MOBILE:
                        Functions.toastString("co mang 3g", getActivity());
                        break;
                    case NetworkUtil.TYPE_NOT_CONNECTED:
                        Functions.toastString("mat mang roi", getActivity());
                        break;
                    default:
                        break;
                    }
                }
            });
            IntentFilter filter = new IntentFilter();
            filter.addAction("android.net.conn.CONNECTIVITY_CHANGE");
            filter.addAction("android.net.wifi.WIFI_STATE_CHANGED");
            getActivity().registerReceiver(mNetworkStateCallback, filter);
        }