一.编写目的
在android开发中,很多时候我们都需要网络交互数据。但在这之前,我们一般会判断网络,这样一方面能使代码更合理,避免无谓的网络访问,另一方面我们可以给用户一个友好的提示,让用户知道网络不通,一些操作无法进行下去。当然还有些做网络测试程序的时候也能用的到。
二.判断网络状况
2.1 利用android原生api中的方法来判断
2.1.1 加入权限
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
2.1.2 获取是否有本地网络
public static boolean IsHaveInternet(final Context context) { try { ConnectivityManager manger = (ConnectivityManager) context .getSystemService(Context.CONNECTIVITY_SERVICE); NetworkInfo info = manger.getActiveNetworkInfo(); Log.e("info;", info + ".."); return (info != null); } catch (Exception e) { return false; } }
2.1.3 优缺点
优点:这样能很快很方便的判断是否有本地网络。缺点:这样虽然判断设备有本地网络,但本地网络是否有效,是否能连接目标网络,这些就无法判断了。
2.2 利用http连接来判断网络状况
2.2.1 添加网络权限
<uses-permission android:name="android.permission.INTERNET" />
2.2.2 判断是否有网络连接
public static boolean isConnect(Context context) { // 获取手机所有连接管理对象(包括对wi-fi,net等连接的管理) try { HttpClient client = new DefaultHttpClient(); HttpGet get = new HttpGet("http://www.baidu.com"); HttpResponse response = client.execute(get); if (response.getStatusLine().getStatusCode() == HttpStatus.SC_OK) { return true; } } catch (Exception e) { Log.v("error", e.toString()); } return false; }
我例子中是用的百度来测试外网是否通畅,如果服务器是内场中使用,使用wifi局域网的话,用百度网址来判断就不太靠谱了,这个时候就需要使用apk正在使用的服务器地址来判断了,呵呵。
2.2.3 优缺点
优点:这样能判断外网是否通畅。缺点:也必须一次网络请求。
2.3 使用ping来测试网络
2.3.1 添加网络权限
<uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
2.3.2 判断ping目标网络是否成功
public String Ping(String str) { String result = "";// ping的结果 Process p; try { // ping -c 2 -w 100 中 ,-c 是指ping的次数 3是指ping 2次 ,-w 30 // 以秒为单位指定超时间隔,是指超时时间为30秒 p = Runtime.getRuntime().exec("ping -c 2 -w 30 " + str); int status = p.waitFor();// 等待响应码 InputStream input = p.getInputStream(); BufferedReader in = new BufferedReader(new InputStreamReader(input)); final StringBuffer buffer = new StringBuffer(); String line = ""; while ((line = in.readLine()) != null) { buffer.append(line + "nr"); } if (status == 0) { buffer.append("nr " + "success"); } else { buffer.append("nr " + "faild"); } result = buffer.toString(); } catch (IOException e) { e.printStackTrace(); } catch (InterruptedException e) { e.printStackTrace(); } return result; }
我这边返回的是ping的具体内容,如果只是要判断网络是否通畅,用status判断就行了。
2.3.3 优缺点:
优点:判断网络很方便。缺点:虽然也有网络请求,但这是这也是必须的。
三.总结
以上介绍了几种判断网络的方法,有些大家可能比较陌生,有些大家比较熟悉。但有一句话说的好,不管是白猫,还是黑猫,抓的住老鼠就是好猫。总之选择最对的方法就是最好的方法。