Android 之 OkHttp + EventBus 进行后台下载网络文件

本文介绍了作者在学习《第一行代码》时,尝试使用EventBus代替AsyncTask和Interface进行网络文件下载的过程。通过OkHttp进行网络请求,结合EventBus在子线程和主线程间传递事件,实现实时更新进度条和状态回显。文章详细讲解了关键代码实现,并分享了在下载过程中遇到的HTTPS证书认证、文件命名、存储空间不足等问题及其解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言:

        本篇文章纯粹是个人学习日记。如有错误或不正确的地方,请指出,谢谢!

        我在学习郭霖的《第一行代码》,就想找找有没有比较简便的方法替代第十章的最佳实践网络下载去下载网络文件。然后就想用EventBus代替其中的 AsyncTask 和 Interface回调接口。

1.EventBus可以非常方便的发送和订阅事件。

2.EventBus自带线程池,利用自身的线程调度机制,随意转换子线程和主线程。

效果图:


上图是下载中的一些操作和回显


上图是完成时的一些回显

自己画了一张大概的"大局流程图",方便大家更容易的理解。


有专家研究过,图像记忆是最好的记忆方法!


导入:

我用的是Android Studio3.0 在app的build.gradle里添加

implementation 'org.greenrobot:eventbus:3.1.1'                 //EventBus导包
implementation 'com.squareup.okhttp3:okhttp:3.10.0'            //OkHttp导包
implementation 'com.daimajia.numberprogressbar:library:1.4@aar'//好看的ProgressBar

EventBus部分代码:

1.自定义MessageEvent实体类
public class MessageEvent {
    private int tag;            //标志位,方便EventBus辨识
    private String url;         //下载地址,我也利用这个传入一些操作信息,所以名字不标准
    private int progress;       //反馈过程的进度

    public MessageEvent(int tag,String url,int progress) {
        super();
        this.tag = tag;
        this.url = url;
        this.progress = progress;
    }

    public int getProgress() {
        return progress;
    }

    public int getTag() {
        return tag;
    }

    public String getUrl() {
        return url;
    }
}

2.子线程的下载流程(敲黑板)

放在Service类里面的

static final int START_DOWNLOAD = 1;            //标志位:开始下载
static final int FAILED__DOWNLOAD = 2;          //标志位:下载失败  
static final int SUCCESS_DOWNLOAD = 3;          //标志位:下载完成
static final int CANCEL_DOWNLOAD = 4;           //标志位:取消下载
static final int PAUSE_DOWNLOAD = 5;            //标志位:暂停下载
static final int UPDATE_PROGRESS = 6;           //标志位:更新进度

private boolean isStarted = false;            //操作子线程的标志状态:是否运行
private boolean isCanceled = false;           //操作子线程的标志状态:是否取消
private boolean isPaused = false;             //操作子线程的标志状态:是否暂停

@Subscribe(threadMode = ThreadMode.ASYNC)
public void onSubThread(MessageEvent event) {
switch (event.getTag()) {
    case START_DOWNLOAD:
        //最开始的启动前台服务消息
        startForeground(1,getNotification("正在获取资源...",-1));

        InputStream is = null;
        RandomAccessFile saveFile = null;
        File file = null;
        try {
            //已经下载的长度
            long downloadLength = 0;

   
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值