网络判断

检测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);
               }
            });
   }
虽然办法有点笨笨的,但是目前好像只能这样。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值