检测app的网络状态,最好的方法就是通过发送广播来通知界面来变化。总共分以下几步:
第一:先注册一个广播
代码注册和直接在manifest里面注册,这里只使用代码注册
//注册检测网络连接是否可用
private void registerNetReceiver(){
myNetReceiver = new MyNetReceiver();
IntentFilter filter = new IntentFilter();
filter.addAction(ConnectivityManager.CONNECTIVITY_ACTION);
registerReceiver(myNetReceiver,filter);
}
public class MyNetReceiver extends BroadcastReceiver {
private boolean flag = false;
MainActivity mainActivity = new MainActivity();
private String host_ip = "";
@Override
public void onReceive(Context context, Intent intent) {
LogUtil.recordLog("接受到网络广播");
WifiManager wifiManager = (WifiManager)context.getSystemService(Context.WIFI_SERVICE);
ConnectivityManager connectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
//移动设备
NetworkInfo mobileInfo = connectivityManager.getNetworkInfo(ConnectivityManager.TYPE_MOBILE);
//wifi设备
NetworkInfo wifiInfo = connectivityManager.getNetworkInfo(ConnectivityManager.TYPE_WIFI);
//判断是否有网络
NetworkInfo info = connectivityManager.getActiveNetworkInfo();
if (info==null){
mainActivity.warning.setVisibility(View.VISIBLE);
}else {
if (wifiInfo.isConnected()){
mainActivity.warning.setVisibility(View.GONE);
// if (ping()){
// mainActivity.warning.setVisibility(View.GONE);
// }else {
// mainActivity.warning.setVisibility(View.VISIBLE);
// }
}else {
mainActivity.warning.setVisibility(View.VISIBLE);
}
}
}
页面布局
<RelativeLayout
android:id="@+id/warning"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="#85000000"
android:layout_alignParentTop="true"
android:visibility="gone"
>
<ImageView
android:id="@+id/imageView3"
android:layout_width="45dp"
android:layout_height="45dp"
android:layout_centerVertical="true"
android:layout_marginLeft="20dp"
android:src="@drawable/warn"/>
<TextView
android:id="@+id/textView3"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="网络连接不可用,请检查网络设置"
android:layout_centerVertical="true"
android:layout_toRightOf="@id/imageView3"
android:layout_margin="22dp"
android:textColor="#ffffff"
android:textSize="30sp"/>
<ImageView
android:id="@+id/delete"
android:layout_width="45dp"
android:layout_height="45dp"
android:layout_alignParentRight="true"
android:layout_marginRight="15dp"
android:padding="7dp"
android:layout_centerVertical="true"
android:src="@drawable/close"/>
</RelativeLayout>
如果判断网络wifi连接着但是没有网络,目前的android的sdk还判断不出来,他只能判断出设备连接上网络没有,因此必须另辟途径,这里也介绍2种办法来判断,都是通过请求网络来进行判断。
第一种
ping外网,例如:www.baidu.com 贴代码
public static final boolean ping() {
String result = null;
try {
String ip = "www.baidu.com";// ping 的地址,可以换成任何一种可靠的外网
Process p = Runtime.getRuntime().exec("ping -c 3 -w 50 " + ip);// ping网址3次
InputStream input = p.getInputStream();
BufferedReader in = new BufferedReader(new InputStreamReader(input));
StringBuffer stringBuffer = new StringBuffer();
String content = "";
while ((content = in.readLine()) != null) {
stringBuffer.append(content);
}
// ping的状态
int status = p.waitFor();
Log.d("------ping-----", "result content : " + stringBuffer.toString() + " status: "+ status);
if (status == 0) {
result = "success";
return true;
} else {
result = "failed";
}
} catch (IOException e) {
result = "IOException";
return false;
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
Log.d("----result---", "result = " + result);
}
return false;
}
第二种就是自己后台写一个比较简单又能检测网络的接口,然后进行访问.
但是这两种方法都存在一个问题,就是在连接着网的情况下,突然没有网络了,但是wifi又连接着,这种情况,安卓是检测不出来的,所以怎么去通知界面通知用户呢。经过反复观察实验,发现微信和qq也是通过访问外网检测是否有网络,所以做了如下总结:
就是每隔一段时间去访问一下外网检测,进行判断。然后贴代码:
timer.schedule(new TimerTask() {
@Override
public void run() {
String lx_url = host_ip
+ "/webservices/Json.aspx?mod=api&act=getqueuelistfor&username="
+ userEntity.loginname;
getNetWork(lx_url);
// String result = null;
// AndroidHttpClient httpClient = null;
// HttpGet httpGet = null;
// HttpResponse httpResponse = null;
// try {
// httpClient = AndroidHttpClient.newInstance("Android");
// httpGet = new HttpGet(lx_url);
// httpResponse = httpClient.execute(httpGet);
// result = EntityUtils.toString(httpResponse.getEntity(),
// "utf-8");
// handler.sendMessage(handler.obtainMessage(3000, result));
// } catch (IOException e) {
// e.printStackTrace();
// } finally {
// if (httpClient != null) {
// httpClient.close();
// }
// }
}
}, 1000, 5 * 1000);
private void getNetWork(String url){
finalHttp.get(url,
new AjaxCallBack<String>() {
@Override
public void onFailure(Throwable t, int errorNo,
String strMsg) {
super.onFailure(t, errorNo, strMsg);
// LogUtil.recordLog("请求超时 "+strMsg + " "+errorNo +" "+t);
warning.setVisibility(View.VISIBLE);
}
@Override
public void onSuccess(String loginJson) {
super.onSuccess(loginJson);
// LogUtil.recordLog("请求成功");
warning.setVisibility(View.GONE);
// int result = JsonUtil.parseLogin(loginJson);
handler.sendMessage(handler.obtainMessage(3000, loginJson));
// LogUtil.recordLog("返回值: "+ loginJson);
}
});
}
虽然办法有点笨笨的,但是目前好像只能这样。