我在连接管理器中偶尔会看到空指针异常。从意图服务我通过isOnWIFI(this)检查网络状态。在cm.getActiveNetworkInfo()行发生异常。这很奇怪,因为我在调用之前检查了null。 注意:权限已设置。
public static boolean isOnWIFI(Context context) {
ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
return cm != null
//here occurs NullPointerException
&& cm.getActiveNetworkInfo() != null
&& ((cm.getNetworkInfo(ConnectivityManager.TYPE_WIFI) != null && cm.getNetworkInfo(
ConnectivityManager.TYPE_WIFI).isConnected()));
}
为什么会发生这种情况?我无法调试它,因为它只是偶尔出现错误报告。我看到的唯一解决方案是将其放入try catch块。感谢。
答案 0 :(得分:6)
你检查api是否提到他们如果没有活动连接他们只是返回null我认为这是你的问题。
http://developer.android.com/reference/android/net/ConnectivityManager.html #getActiveNetworkInfo()
答案 1 :(得分:6)
android_dev是对的。代码中的问题来自cm.getNetworkInfo(ConnectivityManager.TYPE_WIFI).isConnected()));
是的!您之前检查cm.getNetworkInfo(ConnectivityManager.TYPE_WIFI) != null
,但是第二次调用getNetworkInfo()
,android会再次获取网络信息,但这次它不会遇到第二次返回null的活动网络。
问题是,不是因为你之前毫微秒调用getNetworkInfo()
并且没有得到空值,意味着你不会在一毫秒之后得到它
答案 2 :(得分:3)
Try this. Read more here
http://developer.android.com/training/basics/network-ops/managing.html
public static boolean isOnWIFI(Context context) {
ConnectivityManager cm = (ConnectivityManager) this.getSystemService(context.CONNECTIVITY_SERVICE);
if(cm != null){
NetworkInfo networkInfo = cm.getActiveNetworkInfo();
boolean isWiFi = networkInfo.getType() == ConnectivityManager.TYPE_WIFI;
// if user is connected to network
if (isWifi) {
return true;
}else {
return false;
}
}
else{
//cm is null
return false
}
}
答案 3 :(得分:2)
getActiveNetworkInfo
如果没有根据文档>>没有可用的默认连接,则返回null getActiveNetworkInfo。所以我建议你做的是检查网络,每个网络如下所示
NetworkInfo WiFiInfo = connectivityManager.getNetworkInfo(ConnectivityManager.TYPE_WIFI);
NetworkInfo mobileInfo = connectivityManager.getNetworkInfo(ConnectivityManager.TYPE_MOBILE);
然后检查它们是否可用
if(mobileInfo != null & mobileInfo.isConnectedOrConnecting() || WiFiInfo != null & WiFiInfo.isConnectedOrConnecting())
{
//do your task here
}
else {
//show an alert dialog or something
}
答案 4 :(得分:0)
当我使用服务时,这解决了我的问题..在我刚刚使用之前!info.isConnected()但这还不够
ConnectivityManager cm = (ConnectivityManager) getSystemService(CONNECTIVITY_SERVICE);
NetworkInfo info = cm.getActiveNetworkInfo();
if(info==null || !info.isConnected()) {
stopSelf();
return;
}
答案 5 :(得分:-1)
我刚刚制作了一个有这种问题的模板,现在效果很好。你可以尝试这个代码,我在很多设备上试过它,没有问题。 getActiveNetworkInfo()
problem。在我尝试getAllNetworkInfo()
之前,我不明白出了什么问题,但是getAllNetworkInfo()
在某些设备上运行起来很愚蠢。