无法在我的侦听器和广播接收器中涉及接口方法 null object 引用

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

也许我的问题标题在 Whosebug 上还有其他问题,但我找不到任何有用的信息,所以我需要任何人帮助解决我的特定问题: 我想连续检查互联网连接,所以我创建了一个广播接收器扩展 class 并且它有如下监听器:

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);
    }
}

在我的 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;
                }
            }
        });
    }
}

在清单中:

<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>

并且在看到 logcat 之后,我相信 mOnNetworkStateListener 在 NetworkStateReceiver.onReceiver 被触发时总是 null。 不知道哪里出错了?谁能帮我解决这个问题? 提前谢谢大家。

当广播到来时,会创建一个实例,但它与您手动创建的实例不同。所以监听器将为空。

Frg选择:

    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;
                }
            }
        });
    }

您需要注册广播接收器。 完全 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);
    }