Android批量处理上传和下载

效果图

GIF 2021-9-8 10-25-13.gif

GIF 2021-9-8 14-11-24.gif

部分源码和理解说明

一个基于okhttp的文件下载、上传工具

下载:支持多线程、断点续传下载,以及下载管理原理、以及用法

上传:支持表单形式上传、直接将文件作为请求体上传原理、以及用法

批量下载

image.png

这些就是简单类的方法了。
先串联起来就必须有简单单个下载方式。


image.png

这样就是一个简单的方式了。
通过这个思路继续下去,开始批量,进行梳理。

同单例来保障数据获取和下载的独立性

 private volatile static DownloadManger downloadManager;

    public static DownloadManger getInstance(Context context) {
        if (downloadManager == null) {
            synchronized (DownloadManger.class) {
                if (downloadManager == null) {
                    downloadManager = new DownloadManger(context);
                }
            }
        }
        return downloadManager;
    }

    private DownloadManger(Context context) {
        this.context = context;
    }

用DBuilder 来封装获取数据来源问题进行统一。
DownloadProgressHandler 来进行 Handler 数据进行回到和梳理。
FileTask 和ThreadPool 来进行真正的下载功能,在task是一个run方式,对于,每次下载还进处理并记录,从而可以导向的进行每个下载的文件进行合理的显示。

/**
     * data + callback 形式直接开始下载
     *
     * @param downloadData
     * @param downloadCallback
     * @return
     */
    public DownloadManger start(DownloadData downloadData, DownloadCallback downloadCallback) {
        execute(downloadData, downloadCallback);
        return downloadManager;
    }

这个是先通过进行分配和添加,导致可以进行合理的分配处理下载的进度。
然后在进行分离开。

 /**
     * 根据url开始下载(需先注册监听)
     *
     * @param url
     */
    public DownloadManger start(String url) {
        execute(downloadDataMap.get(url), callbackMap.get(url));
        return downloadManager;
    }

    /**
     * 注册监听
     *
     * @param downloadData
     * @param downloadCallback
     */
    public synchronized void setOnDownloadCallback(DownloadData downloadData, DownloadCallback downloadCallback) {
        downloadDataMap.put(downloadData.getUrl(), downloadData);
        callbackMap.put(downloadData.getUrl(), downloadCallback);
    }

根据url开始下载(需先注册监听) 这注册的时候,就是下载码setcallback ....
这样就很好的看到了,我们下载 下载内容了。

/**
     * 执行下载任务
     */
    private synchronized void execute(DownloadData downloadData, DownloadCallback downloadCallback) {
        //防止同一个任务多次下载
        if (progressHandlerMap.get(downloadData.getUrl()) != null) {
            return;
        }

        //默认每个任务不通过多个异步任务下载
        if (downloadData.getChildTaskCount() == 0) {
            downloadData.setChildTaskCount(1);
        }

        DownloadProgressHandler downloadProgressHandler = new DownloadProgressHandler(context, downloadData, downloadCallback);
        FileTask fileTask = new FileTask(context, downloadData, downloadProgressHandler.getHandler());
        downloadProgressHandler.setFileTask(fileTask);

        downloadDataMap.put(downloadData.getUrl(), downloadData);
        callbackMap.put(downloadData.getUrl(), downloadCallback);
        fileTaskMap.put(downloadData.getUrl(), fileTask);
        progressHandlerMap.put(downloadData.getUrl(), downloadProgressHandler);

        ThreadPool.getInstance().getThreadPoolExecutor().execute(fileTask);

        //如果正在下载的任务数量等于线程池的核心线程数,则新添加的任务处于等待状态
        if (ThreadPool.getInstance().getThreadPoolExecutor().getActiveCount() == ThreadPool.getInstance().getCorePoolSize()) {
            downloadCallback.onWait();
        }
    }

这里不得不看 单例里面四个主要的静态的变量了。

private Map<String, DownloadProgressHandler> progressHandlerMap = new HashMap<>();//保存任务的进度处理对象
    private Map<String, DownloadData> downloadDataMap = new HashMap<>();//保存任务数据
    private Map<String, DownloadCallback> callbackMap = new HashMap<>();//保存任务回调
    private Map<String, FileTask> fileTaskMap = new HashMap<>();//保存下载线程

对着四个进行添加和删除的过程就行下载和完成的过程了。

增加部分

1,批量上传
批量处理方式根据批量下载思路来的,这样就必须搞清楚批量下载。然后开始着手去创建,相同的文件和类。


image.png

发现上传 不会续传,后台根本没有这样做,失败了重新上传,或者提示上传失败就完了,
省下了存数据的烦恼了。

/**
     * 根据url开始下载(需先注册监听)
     *
     * @param uploadData
     */
    public UploadManger start(UploadFile uploadData) {
        execute(uploadData, callbackMap.get(uploadData.getFile().getAbsolutePath()));
        return downloadManager;
    }

    /**
     * 注册监听
     *
     * @param uploadData
     * @param uploadCallback
     */
    public synchronized void setOnDownloadCallback(UploadFile uploadData, UploadCallback uploadCallback) {
        uploadDataMap.put(uploadData.getFile().getAbsolutePath(), uploadData);
        callbackMap.put(uploadData.getFile().getAbsolutePath(), uploadCallback);
    }

    /**
     * 执行上传任务
     */
    private synchronized void execute(UploadFile uploadData, UploadCallback uploadCallback) {
        //防止同一个任务多次上传
        if (progressHandlerMap.get(uploadData.getFile().getAbsolutePath()) != null) {
            return;
        }

        uploadDataMap.put(uploadData.getFile().getAbsolutePath(), uploadData);
        callbackMap.put(uploadData.getFile().getAbsolutePath(), uploadCallback);

        Call upload = DUtil.initFormUpload()
                .url("http://192.168.1.110:8080/file/uploadFile") 
                .addFile("file", uploadData.getFile().getName(), uploadData.getFile())
                .fileUploadBuild()
                .upload(uploadCallback);
        progressHandlerMap.put(uploadData.getFile().getAbsolutePath(), upload);
    }

这样 先简化掉线程上传,回调等问题,先进行去操作可以批上传,进行逻辑。

列表代码

image.png
image.png

最后加一键批量下载


image.png
public void startAll(ArrayList<UploadFile> uploadFiles) {
        for (UploadFile bean : uploadFiles) {
            start(bean);
        }
    }
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,875评论 6 496
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,569评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,475评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,459评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,537评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,563评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,580评论 3 414
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,326评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,773评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,086评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,252评论 1 343
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,921评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,566评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,190评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,435评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,129评论 2 366
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,125评论 2 352

推荐阅读更多精彩内容