The precondition is using wifi and mobile network at the same time. onLost function of ConnectivityManager.NetworkCallback is called suddenly after I turned off wifi. That's why NetworkInfo from ConnectivityManager is null and that is the problem here.
But If I put Thread.sleep() for 3 seconds, it works well.
I wonder what the right way is to use ConnectivityManager.NetworkCallback for checking the network status.
new ConnectivityManager.NetworkCallback() {
@Override
public void onAvailable(Network network) {
Log.d(TAG, "ConnectivityManager.NetworkCallback:onAvailable");
context.sendBroadcast(getNetworkStateIntent(isAvailable(context)));
}
@Override
public void onLosing(Network network, int maxMsToLive) {
Log.d(TAG, "ConnectivityManager.NetworkCallback:onLosing");
}
@Override
public void onLost(Network network) {
Log.d(TAG, "ConnectivityManager.NetworkCallback:onLost");
context.sendBroadcast(getNetworkStateIntent(isAvailable(context)));
}
@Override
public void onUnavailable() {
Log.d(TAG, "ConnectivityManager.NetworkCallback:onUnavailable");
context.sendBroadcast(getNetworkStateIntent(isAvailable(context)));
}
};
private boolean isAvailable(Context context) {
Log.d(TAG, "isAvailable");
ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo activeNetworkInfo = cm.getActiveNetworkInfo();
Log.d(TAG, "activeNetworkInfo:" + activeNetworkInfo);
NetworkInfo mWifi = cm.getNetworkInfo(ConnectivityManager.TYPE_WIFI);
Log.d(TAG, "wifi:" + mWifi);
NetworkInfo mMobile = cm.getNetworkInfo(ConnectivityManager.TYPE_MOBILE);
Log.d(TAG, "mobile:" + mMobile);
if(activeNetworkInfo == null) {
Log.d(TAG, "false 'cause activeNetworkInfo is null");
return false;
}
int type = activeNetworkInfo.getType();
switch(type) {
case ConnectivityManager.TYPE_WIFI:
case ConnectivityManager.TYPE_MOBILE:
case ConnectivityManager.TYPE_ETHERNET:
Log.d(TAG, "true");
return true;
default:
Log.d(TAG, "false 'cause of type");
return false;
}
}