原文:http://nammari.tumblr.com/post/33196460309/networksensitivefragment
次组件监听android系统中网络状态的改变事件并提供两个回调方法 intentConnectionEnabled和 internetConnectionDisabled,这样你可以重启一个由于网络断开而导致失败的任务(加载图片,请求数据等)。 Youtube ,Facebook 应该使用次组件。因为如果在读取流或是获取数据时发生网络断开,你需要点击一个Button去重新开启任务!!!如果是由于网络断开而导致任务失败, 这个组件可以帮助他们重新连接。
下面是代码:
package com.example.shapedemo;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.support.v4.app.Fragment;
/** 网络敏感的Fragment */
public abstract class NetworkSensitiveFragemnt extends Fragment {
private BroadcastReceiver mNetWorkBroadCastReciever = new NetWorkBroadCastReciever();
@Override
public void onResume() {
super.onResume();
// 注册网络状态监听
getActivity().registerReceiver(mNetWorkBroadCastReciever,
new IntentFilter("android.net.conn.CONNECTIVITY_CHANGE"));
}
@Override
public void onStop() {
super.onStop();
// 取消网络监听
getActivity().unregisterReceiver(mNetWorkBroadCastReciever);
}
/** 网络由不可用变为可用 */
protected abstract void internetConnectionEnabled();
/** 网络由可用变为不可用 */
protected abstract void internetConnectionDisabled();
/** 网络状态改变的广播接收者 */
private class NetWorkBroadCastReciever extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
if (NetworkSensitiveFragemnt.haveNetworkConnection(context)) {
internetConnectionEnabled();
} else {
internetConnectionDisabled();
}
}
}
/** 判断是否有网络存在,可以放到一个工具类中 */
public static boolean haveNetworkConnection(Context context) {
boolean haveConnectedWifi = false;
boolean haveConnectedMobile = false;
try {
ConnectivityManager cm = (ConnectivityManager) context.getApplicationContext()
.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo[] netInfo = cm.getAllNetworkInfo();
for (NetworkInfo ni : netInfo) {
if (ni != null && ni.getTypeName().equalsIgnoreCase("WIFI"))
if (ni.isConnected())
haveConnectedWifi = true;
if (ni != null && ni.getTypeName().equalsIgnoreCase("MOBILE"))
if (ni.isConnected())
haveConnectedMobile = true;
}
}
catch (Exception ex) {
ex.printStackTrace();
return false;
}
return haveConnectedWifi || haveConnectedMobile;
}
}
使用:
要使用次组件,你应当在清单文件(manifest.xml)加入如下权限:
<uses-permission android:name=”android.permission.ACCESS_NETWORK_STATE” />
然后你就可以继承上面的类并实现两个抽象方法。
例:
package com.example.shapedemo;
public class MyFragment extends NetworkSensitiveFragemnt {
private boolean mNetworkTaskFail = false;
@Override
protected void internetConnectionEnabled() {
if(mNetworkTaskFail){
mNetworkTaskFail = false;
// 移除重试按钮(例如点击重新连接的操作)
// 显示正在重新加载
// 如果有失败的任务,那么重新加载任务
}
}
@Override
protected void internetConnectionDisabled() {
mNetworkTaskFail = true;
}
}