9

我偶尔会在连接管理器中看到空指针异常。从意图服务,我通过 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 块中。谢谢。

4

6 回答 6

6

您是否检查过 api,如果没有活动连接,它们会被提及,它们只是返回 null 我认为这是您的问题。

http://developer.android.com/reference/android/net/ConnectivityManager.html #getActiveNetworkInfo()

于 2013-05-06T13:05:15.883 回答
6

android_dev 是对的。您的代码中的问题来自cm.getNetworkInfo(ConnectivityManager.TYPE_WIFI).isConnected()));

是的!您之前检查cm.getNetworkInfo(ConnectivityManager.TYPE_WIFI) != null过,但通过第二次调用getNetworkInfo(),android 会再次获取网络信息,只是这次它没有遇到第二次返回 null 的活动网络。问题是,不是因为你getNetworkInfo()在一毫秒之前调用并且没有得到空值,这意味着你不会在一毫秒之后得到它

于 2015-12-21T16:58:51.540 回答
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

 }  
}
于 2013-05-06T11:37:56.143 回答
3

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    
}
于 2016-07-25T10:38:40.910 回答
0

当我使用服务时,这解决了我的问题。在我使用 !info.isConnected() 之前,但这还不够

 ConnectivityManager cm = (ConnectivityManager) getSystemService(CONNECTIVITY_SERVICE);
        NetworkInfo info = cm.getActiveNetworkInfo();

        if(info==null || !info.isConnected()) {
            stopSelf();
            return;

        }
于 2014-06-28T16:29:32.007 回答
-1

我刚做了一个有这种问题的模板,现在效果很好。你可以试试这个代码,我在很多设备上都试过了,没有问题。getActiveNetworkInfo()问题。在我尝试之前getAllNetworkInfo(),我不明白出了什么问题,但getAllNetworkInfo()在某些设备上工作很愚蠢。

于 2013-08-10T22:28:32.937 回答