Android开发中网络连接状态的判断(判断android设备是否有网络)

编写不易,如有转载,请声明出处:http://blog.csdn.net/zxc514257857/article/details/68066192

方式一: 可以适用于各种android设备 包括数据网,有线网,和无线网

  • 思路:
      通过Ping 百度来判断网络是否连通.**
  • Demo展示图片:
      无网络情况:
    这里写图片描述
  • 布局代码如下:
//(layout)activity_main.xml
<RelativeLayout    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/activity_main"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.test.networkstate.MainActivity">
    <ImageView
        android:visibility="invisible"
        android:src="@mipmap/etnerror"
        android:layout_margin="10dp"
        android:id="@+id/imageView"
        android:layout_alignParentRight="true"
        android:layout_alignParentBottom="true"
        android:layout_width="40dp"
        android:layout_height="40dp"/>
</RelativeLayout>
  • Activity代码如下:
//(activity)MainActivity
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.View;
import android.widget.ImageView;
import com.squareup.okhttp.Callback;
import com.squareup.okhttp.OkHttpClient;
import com.squareup.okhttp.Request;
import com.squareup.okhttp.Response;
import java.io.IOException;

public class MainActivity extends AppCompatActivity {

    private static final int NETWORKDISCONNECTED = 1;
    private static final int NETWORKCONNECTED = 2;
    private static final String TAG = "MainActivity";
    private ImageView mImageView;
    private Handler handler = new Handler(){
        @Override
        public void handleMessage(Message msg) {
            switch (msg.what) {
                case NETWORKDISCONNECTED:
                    mImageView.setVisibility(View.VISIBLE);
                    break;

                case NETWORKCONNECTED:
                    mImageView.setVisibility(View.INVISIBLE);
                    break;
            }
            super.handleMessage(msg);
        }
    };

    Runnable runnable = new Runnable() {
        @Override
        public void run() {
            checkNetWork();
            //每隔五秒钟检查一下网络
            handler.postDelayed(runnable , 5000);
        }
    };

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        handler.post(runnable);
        checkNetWork();
        initView();
    }

    private void checkNetWork(){
        OkHttpClient client = new OkHttpClient();
        Request request = new  Request.Builder().url("http://www.baidu.com").build();
        client.newCall(request).enqueue(new Callback() {
            @Override
            public void onFailure(Request request, IOException e) {
                Log.i(TAG , "网络访问失败!");
                handler.sendEmptyMessage(NETWORKDISCONNECTED);
            }

            @Override
            public void onResponse(Response response) throws IOException {
                Log.i(TAG , "网络访问成功!");
                handler.sendEmptyMessage(NETWORKCONNECTED);
            }
        });
    }

    private void initView(){
        mImageView = (ImageView) findViewById(R.id.imageView);
    }
}
  • 注: 需要添加权限:
<uses-permission android:name="android.permission.INTERNET"/>

  注:需要导入Okhttp的jar包

Demo下载请移步:http://download.csdn.net/detail/zxc514257857/9797829


**方式二: 不适用于有有线网络接口的android设备,只能判断数据网,有线网 **

  • 思路:通过ConnectivityManager进行判断

  • Demo展示图片:
    这里写图片描述

  • 布局代码如下:

//(layout)activity_main.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
              xmlns:tools="http://schemas.android.com/tools"
              android:layout_width="match_parent"
              android:layout_height="match_parent"
              android:orientation="vertical"
              tools:context="com.test.activity.MainActivity">
    <TextView
        android:id="@+id/warning"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="#FEC7DE"
        android:padding="10dp"
        android:textColor="#000"
        android:text="网络不给力,请检查网络设置。"
        android:visibility="gone"/>
    <View
        android:layout_width="match_parent"
        android:layout_height="1dp"
        android:background="#2000">
    </View>
    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="65dp">
        <ImageView
            android:src="@mipmap/circle"
            android:layout_width="60dp"
            android:layout_height="wrap_content"
            android:id="@+id/imageView"
            android:layout_marginLeft="10dp"/>
        <RelativeLayout
            android:layout_centerVertical="true"
            android:layout_toRightOf="@+id/imageView"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content">
            <RelativeLayout
                android:id="@+id/firstLine"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content">
                <TextView
                    android:text="测试帐号"
                    android:textSize="16sp"
                    android:textColor="#000"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:id="@+id/title"
                    android:layout_marginLeft="13dp"/>
                <TextView
                    android:textSize="14sp"
                    android:text="18:00"
                    android:textColor="#999"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:id="@+id/textView"
                    android:layout_marginRight="13dp"
                    android:layout_marginEnd="13dp"
                    android:layout_alignBaseline="@+id/title"
                    android:layout_alignBottom="@+id/title"
                    android:layout_alignParentRight="true"/>

            </RelativeLayout>
            <TextView
                android:id="@+id/content"
                android:text="王健林:先定一个小目标,比如挣它一个亿"
                android:textSize="14sp"
                android:textColor="#999"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_below="@+id/firstLine"
                android:layout_marginLeft="13dp"
                android:layout_marginTop="8dp"/>
        </RelativeLayout>
    </RelativeLayout>
    <View
        android:layout_width="match_parent"
        android:layout_height="1dp"
        android:background="#2000">
    </View>
</LinearLayout>
  • Receiver代码如下:
//(receiver)NetBroadcastReceiver
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.net.ConnectivityManager;
import com.test.utils.NetUtils;
import com.test.activity.BaseActivity;
public class NetBroadcastReceiver extends BroadcastReceiver {
    public NetEvevt evevt = BaseActivity.evevt;
    @Override
    public void onReceive(Context context, Intent intent) {
        if (intent.getAction().equals(ConnectivityManager.CONNECTIVITY_ACTION)) {
            int netWorkState = NetUtils.getNetWorkState(context);
            // 接口回调传过去状态的类型
            evevt.onNetChange(netWorkState);
        }
    }
    // 自定义接口
    public interface NetEvevt {
        void onNetChange(int netMobile);
    }
}
  • Utils代码如下:
//(utils)NetUtils
import android.content.Context;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;

public class NetUtils {
    //没有连接网络
    public static final int NETWORK_NONE = -1;
    //移动网络
    public static final int NETWORK_MOBILE = 0;
    //无线网络
    public static final int NETWORK_WIFI = 1;
    public static int getNetWorkState(Context context) {
        // 得到连接管理器对象
        ConnectivityManager connectivityManager = (ConnectivityManager) context
                .getSystemService(Context.CONNECTIVITY_SERVICE);
        NetworkInfo activeNetworkInfo = connectivityManager
                .getActiveNetworkInfo();
        if (activeNetworkInfo != null && activeNetworkInfo.isConnected()) {
            if (activeNetworkInfo.getType() == (ConnectivityManager.TYPE_WIFI)) {
                return NETWORK_WIFI;
            } else if (activeNetworkInfo.getType() == (ConnectivityManager.TYPE_MOBILE)) {
                return NETWORK_MOBILE;
            }
        } else {
            return NETWORK_NONE;
        }
        return NETWORK_NONE;
    }
}

  Activity代码如下:

//(activity)BaseActivity
import android.app.Activity;
import android.os.Bundle;
import com.test.receiver.NetBroadcastReceiver;
import com.test.utils.NetUtils;

public class BaseActivity extends Activity implements NetBroadcastReceiver.NetEvevt {
    public static NetBroadcastReceiver.NetEvevt evevt;
    //网络类型
    private int netMobile;
    @Override
    protected void onCreate(Bundle arg0) {
        super.onCreate(arg0);
        evevt = this;
        inspectNet();
    }
    //初始化时判断有没有网络
    public boolean inspectNet() {
        this.netMobile = NetUtils.getNetWorkState(BaseActivity.this);
        return isNetConnect();
    }
    //网络变化之后的类型
    @Override
    public void onNetChange(int netMobile) {
        this.netMobile = netMobile;
        isNetConnect();
    }
    //判断有无网络
    //true 有网, false 没有网络.
    public boolean isNetConnect() {
        if (netMobile == NetUtils.NETWORK_WIFI) {
            return true;
        } else if (netMobile == NetUtils.NETWORK_MOBILE) {
            return true;
        } else if (netMobile == NetUtils.NETWORK_NONE) {
            return false;
        }
        return false;
    }
}

----------------------------------------------------------------------------------------
//(activity)MainActivity
import android.os.Bundle;
import android.view.View;
import android.widget.TextView;
import com.demonet.R;
import com.test.utils.NetUtils;

public class MainActivity extends com.test.activity.BaseActivity {
    private TextView mTv;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mTv= (TextView) findViewById(R.id.warning);
        //启动时判断网络状态
        boolean netConnect = this.isNetConnect();
        if (netConnect){
            mTv.setVisibility(View.GONE);
        }else {
            mTv.setVisibility(View.VISIBLE);
        }
    }
    @Override
    public void onNetChange(int netMobile) {
        super.onNetChange(netMobile);
        //网络状态变化时的操作
        if (netMobile== NetUtils.NETWORK_NONE){
            mTv.setVisibility(View.VISIBLE);
        }else {
            mTv.setVisibility(View.GONE);
        }
    }
}

  注:需要添加权限

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

  注:需要在AndroidManifest文件中静态注册广播接收者

<receiver android:name="com.test.receiver.NetBroadcastReceiver" >
    <intent-filter>
        <action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
    </intent-filter>
</receiver>

Demo下载请移步:http://download.csdn.net/detail/zxc514257857/9830686


----------因本人才疏学浅,如博客或Demo中有错误的地方请大家随意指出,与大家一起讨论,共同进步,谢谢!----

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

DreamBackTo

感谢各位金主大大(* _ *)

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值