现在的app,不访问网络的基本上没有了。在访问网络前检测一下网络连接以避免访问网络时的操作还是很有必要的。
检测网络连接一般由ConnectivityManager实现。实现方式有两种:主动检测,被动监听。
一、被动监听(实时监听)
在网络连接改变的时候要改变界面或者其他操作,但是没有请求网络这个操作,这就要写一个监听。在网络连接状态转换的时候发一个广播,然后调用回调方法。实现代码如下:
- 广播实现
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
/**
* Created by yushan on 2017-5-18.
*/
public class ConnectionChangeReceiver extends BroadcastReceiver {
private Boolean connectState;
private OnStateChangedListener mOnStateChangedListener;
@Override
public void onReceive(Context context, Intent intent) {
ConnectivityManager connectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
if (connectivityManager != null){
// 手机信号/3G/4G
NetworkInfo mobNetInfo = connectivityManager.getNetworkInfo(ConnectivityManager.TYPE_MOBILE);
// Wifi
NetworkInfo wifiNetInfo = connectivityManager.getNetworkInfo(ConnectivityManager.TYPE_WIFI);
if (!mobNetInfo.isConnected() && !wifiNetInfo.isConnected()) {
mOnStateChangedListener.onStateChanged(false);
} else {
mOnStateChangedListener.onStateChanged(true);
}
} else {
mOnStateChangedListener.onStateChanged(false);
}
}
public void setOnStateChangedListener(OnStateChangedListener mOnStateChangedListener) {
this.mOnStateChangedListener = mOnStateChangedListener;
}
/**
* 状态改变的监听器
*/
public interface OnStateChangedListener {
/**
* 状态改变时,回调方法
*
* @param state
*/
void onStateChanged(boolean state);
}
}
- 在使用的类中注册广播
private void registerReceiver(){
IntentFilter filter=new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION);
myReceiver = new ConnectionChangeReceiver();
this.registerReceiver(myReceiver, filter);
myReceiver.setOnStateChangedListener(new ConnectionChangeReceiver.OnStateChangedListener() {
@Override
public void onStateChanged(boolean state) {
if (state){
// 有网络连接 进行什么操作
Toast.makeText(MainActivity.this,"state:" + state,Toast.LENGTH_SHORT).show();
} else {
// 无网络连接 进行什么操作
Toast.makeText(MainActivity.this,"state:" + state,Toast.LENGTH_SHORT).show();
}
}
});
}
- 在适当的位置注销广播
private void unregisterReceiver(){
if (myReceiver != null){
this.unregisterReceiver(myReceiver);
}
}
二、主动检测
在每次访问网络之前主动获取一下网络连接状态,我们只要在上面中的代码中做一下改动就可以了,实现代码如下:
@Override
public void onReceive(Context context, Intent intent) {
ConnectivityManager connectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
if (connectivityManager != null){
// 手机信号/3G/4G
NetworkInfo mobNetInfo = connectivityManager.getNetworkInfo(ConnectivityManager.TYPE_MOBILE);
// Wifi
NetworkInfo wifiNetInfo = connectivityManager.getNetworkInfo(ConnectivityManager.TYPE_WIFI);
if (!mobNetInfo.isConnected() && !wifiNetInfo.isConnected()) {
connectState = false;
mOnStateChangedListener.onStateChanged(false);
} else {
connectState = true;
mOnStateChangedListener.onStateChanged(true);
}
} else {
connectState = false;
mOnStateChangedListener.onStateChanged(false);
}
}
public Boolean getConnectState(){
return connectState;
}
检测网络连接状态就到这里了,虽然很简单,但是比较实用,希望这篇博客能为你提供一些帮助。