一分钟实现多文件断点续传——断点续传框架

本文详细介绍了一个封装好的Android多文件断点续传框架的使用方法。通过简单的几步配置即可实现文件的断点续传功能,并利用EventBus来更新UI显示下载进度。

本人先前的博客有对多文件分段断点续传的功能进行详细的介绍,如果你有兴趣可以先阅读Android多文件断点续传(一)——数据封装以及界面实现。本人在先前的基础上对代码进行了封装,本帖主要介绍如何集成封装好的框架快速实现多文件分段断点续传功能。

先看效果图

这里写图片描述

Github地址

——————————————————————————————————————————

1. 在Module下的build.gradle中添加依赖


dependencies {
    ... ...
    compile 'com.androidkun:breakpoints:1.0.0'
}

2. 开始下载以及暂停下载

  viewHoder.btnStart.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                DownloadUtils.downLoad(context, downloadInfo.getUrl(), downloadInfo.getSavePath(), downloadInfo.getFileName(), downloadInfo.getThreadCount());
            }
        });
        viewHoder.btnPause.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                downloadInfo.setDownState(context.getResources().getString(R.string.state_pause));
                viewHoder.textState.setText(downloadInfo.getDownState());
                DownloadUtils.pauseDownLoad(context, downloadInfo.getUrl());
            }
        });

参数解释:

/**
     * 开始下载
     * @param context
     *         上下文
     * @param url
     *        下载链接
     * @param savePath
     *        保存路径
     * @param fileName
     *        下载线程数
     * @param downloadThreadCount
     */
     public static void downLoad(Context context,String url,String savePath,String fileName,int downloadThreadCount){
      ... ...
     }
  /**
     * 暂停下载
     * @param context
     *        上下文
     * @param url
     *        下载链接
     */
    public static void pauseDownLoad(Context context,String url){
        ... ...
    }

3. 在Activity中注册EventBus获取下载进度和下载状态刷新UI


public class MainActivity extends AppCompatActivity {

    ... ...

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        EventBus.getDefault().register(this);
        initView();
        initData();
    }

    private void initData() {
        ... ...
    }

    private void initView(){
        ... ...
    }

    @Subscribe(threadMode = ThreadMode.MAIN)
    public void getEventMessage(EventMessage eventMessage) {
        switch (eventMessage.getType()){
            case EventMessage.TYPE_START://开始下载
                DownloadData start = (DownloadData) eventMessage.getObject();
                adapter.refreshState(start.getUrl(),start.getLength(),getResources().getString(R.string.state_downloading));
                break;
            case EventMessage.TYPE_PROGRESS://下载进度
                DownloadData progress = (DownloadData) eventMessage.getObject();
                //刷新列表进度
                adapter.updateProgress(progress.getUrl(),progress.getProgress());
                break;
            case EventMessage.TYPE_FINISHED://下载完成
                DownloadData finished = (DownloadData) eventMessage.getObject();
                adapter.refreshState(finished.getUrl(),finished.getLength(),getResources().getString(R.string.state_finished));
                break;
            case EventMessage.TYPE_ERROR://下载失败
                DownloadData error = (DownloadData) eventMessage.getObject();
                adapter.refreshState(error.getUrl(),error.getLength(),getResources().getString(R.string.state_fail));
                break;
            case EventMessage.TYPE_PAUSE://下载暂停
                DownloadData pause = (DownloadData) eventMessage.getObject();
                adapter.refreshState(pause.getUrl(),pause.getLength(),getResources().getString(R.string.state_pause));
                break;
        }
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        EventBus.getDefault().unregister(this);
    }
}

在getEventMessage()方法中可以获取到当前下载状态,DownloadData 封装了下载文件的url,下载进度,文件长度等信息。根据EventMessage的type区分事件类型,再做出相应处理。

public class DownloadData {
    /**
     * 下载链接
     */
    private String url;
    /**
     * 下载进度(0-100)
     */
    private int progress;
    /**
     * 文件大小
     */
    private int length;
    /**
     * 下载消息
     */
    private String msg;
    /**
     * 文件路径
     */
    private String filePath;

    ... ...

}

更多细节请看源码

————————————————————————————————

源码下载

### 解决网络传输EXE文件时接收端超时问题 当遇到通过网络传输较大文件(如EXE文件)时,接收端可能出现超时的情况。这通常是因为文件体积大导致传输时间过长,在某些情况下超过了预设的连接或读取超时期限。 为了有效解决这个问题,可以从以下几个方面入手: #### 1. 增加超时设置 调整应用程序中的超时参数是一个简单而直接的办法。对于大多数编程环境而言,都可以配置HTTP请求或其他协议下的超时选项。例如,在Python中使用`requests`库发送文件时可以通过如下方式增加超时时间: ```python import requests with open('example.exe', 'rb') as file: response = requests.post(url='http://destination.com/upload', files={'upload_file': file}, timeout=600) # 设置为600秒即10分钟 ``` 此代码片段展示了如何将上传操作的最大等待时间延长至十分钟[^1]。 #### 2. 实现断点续传功能 实现断点续传能够显著提升大型文件在网络不稳定情况下的成功率。这种方式允许在中断后继续未完成的部分而不是重新开始整个过程。FTP协议本身支持这种特性;而对于其他类型的传输,则可能需要自定义解决方案或者利用第三方工具和服务来达成目标。 #### 3. 利用多路径传输技术 考虑到单条链路可能存在波动影响整体效率,采用多路径传输方案不失为一种明智的选择。这种方法允许多个物理路径共同参与同一会话的数据交换工作,从而提高了吞吐量并减少了因单一路径故障引发的风险。研究表明,多路径传输能与TCP重传及超时机制协同作用,减少不必要的重复传送次数以及缩短延时现象的发生概率[^2]。 #### 4. 文件分片处理 另一种策略是对待传输的大文件进行分割成较小部分后再逐一传递过去。这样做不仅有助于规避一次性转移大量数据带来的潜在风险,而且还可以简化错误恢复流程——只需针对失败的小块实施补救措施而不必担心整包丢失的问题。具体做法可以参照Qt框架下关于批量下载文件的例子来进行编码实践[^3]。 以上几种方法均可用于改善EXE这类相对较大的二进制文件在网络间流通过程中所遭遇的各种挑战,特别是面对接收侧报告有超时状况的情形尤为适用。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值