Android 下载模块,使用Xutils3 的下载功能,Activity和services数据交互,listview显示下载进度

本文介绍了一个使用Xutils3实现的Android下载模块,包括如何在Activity和服务间进行数据交互,以及如何在ListView中展示下载进度。在下载过程中,即使APP关闭也能记录并断点续传下载进度,同时支持音乐的增删、暂停,以及显示下载速度和进度。重点在于DownloadService类的设计,以及如何处理文件名和权限问题。

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

临近过年,今天将花了两天时间写的下载模块贡献出来,以前我也是天天需要什么功能,就天天查百度,现在自己也能开源一点东西了,也是非常很开心的,hahaha。

这里写图片描述

离职前写了音乐播放器的音乐下载界面,自己封装了下载线程,并使用多线程断点续传下载音乐,感觉多线程下载音乐也并不比单线程下载快多少,就一个4M的音乐来说,开3条线程下了46s,单线程下了60s,如果同时现在3个音乐,那么多线程下载相当于开了9 个线程,速度尽然和单线程的速度持平,有时候还会慢于3条线程,于是我放弃了多线程断点续传,还是老老实实写单线程的吧(- -!我觉得应该是我的下载线程的毛病,哈哈)。。。

于是今天就用了xutils3的网络访问模块,实现的需求是。
1、APP关闭后(kill),重新开启时,能记录当前下载进度,断点续传。
2、音乐能增删,暂停,显示下载速度和下载进度。

其实都写好了哈,主要说说编码思路。

通过Acitivity的bindService,可以调用service的bind来传递需要下载的文件信息到service,service通过调用xutils的带进度的下载模块,来回调下载信息,同时service通过下载观察者不断观察下载进度,将进度传递给Activity,之后setAdapter即可。

里面最主要的东西就是DownloadService,所有的代码逻辑都是这个类处理的。

传递下载文件信息的类MainActivity

这个类有个问题
就是文件名的获取是根据Url倒叙截取/后面的文件来命名的,如果你的url不符合规则,请自行定义。


    private String getfileName(String url) {//根据下载地址给下载文件命名
        try{
            return url.substring(url.lastIndexOf("/") + 1);
        }catch (Exception ex){
            return mBinder.getCurrentListSize()+"";//返回一个数字
        }
    }

权限问题
代码中加了6.0的动态权限判断,因为要操作SD卡,所以这里也要注意。
因为我没有6.0的测试手机,所以这里虽然都写了,但是只是作为提示使用,需要你自己更改逻辑位置,如果是6.0以下的,并没有问题的 。


Handler handler = new Handler(){
        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);
            switch (msg.what){
                case 0:
                    Toast.makeText(getBaseContext(),"已获取SD卡权限",Toast.LENGTH_SHORT).show();
                    //6.0系统在这里进行service的初始化
                    break;
                case 1:
                    Toast.makeText(getBaseContext(),"SD卡权限未开启",Toast.LENGTH_SHORT).show();
                    break;
            }
        }
    };

    //判断权限方法
    private void initCheckSelfPermission() {
        //判断是否有内存卡权限
        CheckSelfPermission.getSDCard(this);
    }
    //动态权限回调
    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
   
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        doNext(requestCode,grantResults);
    }
    //动态权限回调,yes和no点击
    private void doNext(int requestCode, int[] grantResults) {
        if (requestCode == DownLoadConstant.WRITE_EXTERNAL_STORAGE_REQUEST_CODE) {
            if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                LogUtils.d("权限获取成功");
                handler.sendEmptyMessage(0);
            } else {
                handler.sendEmptyMessage(1);
            }
        }
    }

最关键的是DownloadService ,bind里有对外提供的增删改查方法
在下载的过程中,有缓存GetFileSharePreance 不断在保存下载的urls下载地址列表和文件下载进度,为APP下次重启提供断点,里面有详细注释。



/**
 * 作者:朱亮 on 2017/1/17 15:36
 * 邮箱:171422696@qq.com
 * 下载服务类,执行下载任务,并将进度传递到Activity中(这里用一句话描述这个方法的作用)
 */
public class DownloadService extends Service {

    public static final String ACTION_START = "ACTION_START";
    public static final String ACTION_STOP = "ACTION_STOP";
    public static final String ACTION_DELETE = "ACTION_DELETE";
    private List<OnDownLoadBackListener> loadBackListeners = new ArrayList<
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值