【问题标题】:Checking internet connection in android using getActiveNetworkInfo使用 getActiveNetworkInfo 检查 android 中的互联网连接
【发布时间】:2016-09-27 05:00:08
【问题描述】:

如果您想在 android 中检查 互联网连接,有很多方法可以做到这一点 例如:

   public boolean isConnectingToInternet(){
    ConnectivityManager connectivity = (ConnectivityManager) _context.getSystemService(Context.CONNECTIVITY_SERVICE);
      if (connectivity != null) 
      {
          NetworkInfo[] info = connectivity.getAllNetworkInfo();
          if (info != null) 
              for (int i = 0; i < info.length; i++) 
                  if (info[i].getState() == NetworkInfo.State.CONNECTED)
                  {
                      return true;
                  }

      }
      return false;
    }

getAllNetworkInfo(); 在 api 级别 23 中已弃用,因此我需要一个解决方案来检查 api 级别 23 和之前的互联网连接,我找到了另一种方法来做到这一点

 private boolean isConnectedToInternet()
{
    ConnectivityManager cm = (ConnectivityManager) SplashActivity.this.getSystemService(Context.CONNECTIVITY_SERVICE);
    NetworkInfo activeNetwork = cm.getActiveNetworkInfo();
        if (activeNetwork != null) { // connected to the internet
            if (activeNetwork.getType() == ConnectivityManager.TYPE_WIFI) {
                // connected to wifi
                Toast.makeText(SplashActivity.this, activeNetwork.getTypeName(), Toast.LENGTH_SHORT).show();
                return true;
            } else if (activeNetwork.getType() == ConnectivityManager.TYPE_MOBILE) {
                // connected to the mobile provider's data plan
                Toast.makeText(SplashActivity.this, activeNetwork.getTypeName(), Toast.LENGTH_SHORT).show();
                return true;
            }
        } 
    return false;
}

我的问题是关于 getActiveNetworkInfo() 和 isConnected() 谷歌为此方法提供的文档是here

返回有关当前活动的默认数据网络的详细信息。连接后,此网络是传出连接的默认路由。在启动网络流量之前,您应该始终检查 isConnected()。当没有默认网络时,这可能会返回 null。

为什么我们需要在 getActiveNetworkInfo() 上调用 isConnected() 来检查互联网连接,而我们可以用 null 检查 getActiveNetworkInfo() 的返回值 strong> 如果不为 null,我们有互联网连接,否则如果返回 null,则在运行时调用 getActiveNetworkInfo() 上的 isConnected() 会引发 空指针异常?

【问题讨论】:

标签: android internet-connection


【解决方案1】:

使用我的 util 类:

import android.content.Context;
import android.net.ConnectivityManager;
import android.net.Network;
import android.net.NetworkInfo;

/**
 * Created by ozgur on 16.04.2016.
 */
public class Utils {

    public static boolean isConnected(Context context){
        ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);

        if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.LOLLIPOP) {

            Network[] activeNetworks = cm.getAllNetworks();
            for (Network n: activeNetworks) {
                NetworkInfo nInfo = cm.getNetworkInfo(n);
                if(nInfo.isConnected())
                    return true;
            }

        } else {
            NetworkInfo[] info = cm.getAllNetworkInfo();
            if (info != null)
                for (NetworkInfo anInfo : info)
                    if (anInfo.getState() == NetworkInfo.State.CONNECTED) {
                        return true;
                    }
        }

        return false;

    }
}

【讨论】:

    【解决方案2】:

    已弃用的网络信息。使用网络回调。这就是方法。

    public void registerNetworkCallback()
    {
        try {
            ConnectivityManager connectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
            NetworkRequest.Builder builder = new NetworkRequest.Builder();
    
            connectivityManager.registerNetworkCallback(builder.build(),new ConnectivityManager.NetworkCallback() {
                        @Override
                        public void onAvailable(Network network) {
                            Variables.isNetworkConnected = true; // Global Static Variable
                        }
                        @Override
                        public void onLost(Network network) {
                            Variables.isNetworkConnected = false; // Global Static Variable
                        }
                    }
    
            );
            Variables.isNetworkConnected = false;
        }catch (Exception e){
            Variables.isNetworkConnected = false;
        }
    }
    

    请在此处查看完整代码:Gist

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-06-12
      • 1970-01-01
      • 2016-01-16
      • 1970-01-01
      • 1970-01-01
      • 2016-08-28
      • 1970-01-01
      • 2012-02-21
      相关资源
      最近更新 更多