一.编写目的
在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 优缺点:
优点:判断网络很方便。缺点:虽然也有网络请求,但这是这也是必须的。
三.总结
以上介绍了几种判断网络的方法,有些大家可能比较陌生,有些大家比较熟悉。但有一句话说的好,不管是白猫,还是黑猫,抓的住老鼠就是好猫。总之选择最对的方法就是最好的方法。