前提条件是同时使用wifi和移动网络。在我关闭wifi后,ConnectivityManager.NetworkCallback的onLost函数突然被调用。这就是为什么ConnectivityManager中的NetworkInfo为空的问题所在。
但是如果我使用Thread.sleep()等待3秒钟,它就能正常工作。
我想知道使用ConnectivityManager.NetworkCallback来检查网络状态的正确方法是什么。
但是如果我使用Thread.sleep()等待3秒钟,它就能正常工作。
我想知道使用ConnectivityManager.NetworkCallback来检查网络状态的正确方法是什么。
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;
}
}