上一篇中我们已经介绍了如何实现多文件分段断点续传,如果你还没阅读过,建议先阅读上一篇Android多文件断点续传(三)——实现文件断点续传。本篇接着对该功能进行简单的优化,在网络状态断开的情况下能自动保存下载进度,并在网络状态恢复连接的情况下继续自动下载。
首先我们需要在AndroidManifest.xml中增加读取网络状态的权限。
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
接着在DownloadService中定义一个广播接受者,用于接收系统发出的网络状态广播。
private class NetConnectionReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
ConnectivityManager connectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo mobNetInfo = connectivityManager.getNetworkInfo(ConnectivityManager.TYPE_MOBILE);
NetworkInfo wifiNetInfo = connectivityManager.getNetworkInfo(ConnectivityManager.TYPE_WIFI);
if (!mobNetInfo.isConnected() && !wifiNetInfo.isConnected()) {
for (DownloadTask downloadTask : downloadTasks) {
downloadTask.pauseDownload();
}
} else {
for (DownloadTask downloadTask : downloadTasks) {
downloadTask.startDownload();
}
}
}
}
在DownloadService创建的时候注册广播,拦截ConnectivityManager.CONNECTIVITY_ACTION广播事件。
@Override
public void onCreate() {
super.onCreate();
... ...
IntentFilter filter = new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION);
netConnectionReceiver = new NetConnectionReceiver();
registerReceiver(netConnectionReceiver, filter);
}
最后在DownloadService销毁的时候注销广播。
@Override
public void onDestroy() {
... ...
EventBus.getDefault().unregister(this);
unregisterReceiver(netConnectionReceiver);
}
我们着重看一下NetConnectionReceiver中的代码
ConnectivityManager connectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE)
NetworkInfo mobNetInfo = connectivityManager.getNetworkInfo(ConnectivityManager.TYPE_MOBILE)
NetworkInfo wifiNetInfo = connectivityManager.getNetworkInfo(ConnectivityManager.TYPE_WIFI)
if (!mobNetInfo.isConnected() && !wifiNetInfo.isConnected()) {
//网络连接已断开
for (DownloadTask downloadTask : downloadTasks) {
downloadTask.pauseDownload()
}
} else {
//网络连接已连接
for (DownloadTask downloadTask : downloadTasks) {
downloadTask.startDownload()
}
}
}
首先通过系统的连接管理者获取到手机网络信息和wifi网络信息,通过手机网络连接状态和wifi网络连接状态得到当前网络连接状态。在网络断开情况下停止所有下载任务。在网络恢复连接的情况下载开始下载任务,这里暂停下载任务的方法pauseDownload()跟原来的一样,没有改动过。而startDownload()为新增加的方法。
/**
* 开始下载
*/
public void startDownload(){
downloadThreads.clear();
threads.clear();
finishedProgress = 0;
initDownThreads();
}
可以看到其实是将DownloadTask之前的数据清空,然后再重新调用initDownThreads()方法重新创建下载线程进行下载。
到这处理网络状态变化的功能就完成了,如果有什么地方遗漏有误,欢迎指正。