Android:检查网络和真实的互联网连接 [英] Android: Check network and real internet connectivity

查看:29
本文介绍了Android:检查网络和真实的互联网连接的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

下面是一段 Android 代码,可以很好地检查网络是否已连接.

Below is the piece of Android code which works fine to check if network is connected or not.

public static boolean isNetworkAvailable(Context context) 
{
    ConnectivityManager mConnectivityManager = (ConnectivityManager)context.getSystemService(Context.CONNECTIVITY_SERVICE);
    return (mConnectivityManager != null && mConnectivityManager.getActiveNetworkInfo().isConnectedOrConnecting()) ? true : false;
}

<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

但拥有活动网络接口并不能保证特定的网络服务可用.

But having an active network interface doesn't guarantee that a particular networked service is available.

很多时候我们已经连接到网络,但仍然无法访问常见的互联网网络服务,例如谷歌

A lot of time happens that we are connected to network but still not reachable to common internet network services, e.g. Google

常见场景:

  1. 连接到 Wi-Fi 的 Android 设备,结果证明它是私人的网络.所以 isNetworkAvailable 将返回网络已连接,但可以不连接到任何其他服务
  2. 有时,电话信号显示它已连接到服务提供商数据计划.所以网络连接是真实的,但仍然无法访问 Google/Yahoo.

一种方法是检查isNetworkAvailable"函数是否返回TRUE,然后运行以下代码

HttpGet request = new HttpGet(url));
   HttpParams httpParameters = new BasicHttpParams();
   int timeoutConnection = 60000;
   HttpConnectionParams.setConnectionTimeout(httpParameters, timeoutConnection);
   int timeoutSocket = 60000;
   HttpConnectionParams.setSoTimeout(httpParameters, timeoutSocket);

   DefaultHttpClient httpClient = new DefaultHttpClient(httpParameters);
   request.addHeader("Content-Type", "application/json");
   HttpResponse response = httpClient.execute(request);

   HttpEntity entity = response.getEntity();


     if (entity != null)
      {
         result = EntityUtils.toString(entity);
      }

   }
 catch (SocketException e)
  {
     return "Socket Exceptiopn:" + e.toString();
  }
 catch (Exception e)
  {
     return "General Execption:" + e.toString();
  }

但我认为这不是一个好方法,因为它可能会消耗很多时间

But I think this is not an good way because it may consume lot of time

那么有没有其他有效的(在时间、速度方面)的方式来确保我们连接到网络并且可以访问最常见的互联网服务?

推荐答案

检查此代码...它对我有用 :)

check this code... it worked for me :)

public static void isNetworkAvailable(final Handler handler, final int timeout) {

        // ask fo message '0' (not connected) or '1' (connected) on 'handler'
        // the answer must be send before before within the 'timeout' (in milliseconds)

        new Thread() {

            private boolean responded = false;

            @Override
            public void run() {

                // set 'responded' to TRUE if is able to connect with google mobile (responds fast)

                new Thread() {

                    @Override
                    public void run() {
                        HttpGet requestForTest = new HttpGet("http://m.google.com");
                        try {
                            new DefaultHttpClient().execute(requestForTest); // can last...
                            responded = true;
                        } catch (Exception e) {}
                    }

                }.start();

                try {
                    int waited = 0;
                    while(!responded && (waited < timeout)) {
                        sleep(100);
                        if(!responded ) { 
                            waited += 100;
                        }
                    }
                } 
                catch(InterruptedException e) {} // do nothing 
                finally { 
                    if (!responded) { handler.sendEmptyMessage(0); } 
                    else { handler.sendEmptyMessage(1); }
                }

            }

        }.start();

}

然后,我定义处理程序:

Then, I define the handler:

Handler h = new Handler() {

    @Override
    public void handleMessage(Message msg) {

        if (msg.what != 1) { // code if not connected

        } else { // code if connected

        }

    }
};

并启动测试:

isNetworkAvailable(h,2000); // get the answser within 2000 ms

来自 Gilbou 的代码 https://stackoverflow.com/a/5803489/2603719

Code from Gilbou https://stackoverflow.com/a/5803489/2603719

希望能帮到你

这篇关于Android:检查网络和真实的互联网连接的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆