安卓批量上传

508 阅读1分钟

支持功能

  • 多任务批量上传;
  • 上传状态储存(结合数据库);
  • 进度监听(需具体网络上传框架支持,如okhttp,oss等);
  • 上传取消;
  • 上传错误(或强杀)后点击重新上传;
  • 可根据实际业务需求改造...

GitHub:github.com/baiyuliang/…

效果如图:

在这里插入图片描述在这里插入图片描述

代码结构:

在这里插入图片描述

数据库:

在这里插入图片描述

GitHub:github.com/baiyuliang/…

demo中仅做了模拟上传,而实际应用中,只需在UploadTask中,替换上传框架UploadClient,并添加上传回调即可:

 @SuppressLint("SimpleDateFormat")
    @Override
    public void run() {
        if (mTaskEntity == null || TextUtils.isEmpty(mTaskEntity.getTaskId()) || TextUtils.isEmpty(mTaskEntity.getUrl())) {
            return;
        }

        sendHandlerMessage(0, TaskState.TASK_STATUS_UPLOADING);
        mTaskEntity.setTaskStatus(TaskState.TASK_STATUS_UPLOADING);
        TaskDaoManager.instance().update(mTaskEntity);

        uploadClient = new UploadClient();
        uploadClient.setOnUploadProgress((currentSize, totalSize) -> {
            mTaskEntity.setCompletedSize(currentSize);
            mTaskEntity.setTotalSize(totalSize);
            TaskDaoManager.instance().update(mTaskEntity);
            sendHandlerMessage(0, TaskState.TASK_STATUS_UPLOADING);
        });
        uploadClient.upload(mTaskEntity.getUrl(), new UploadClient.OnUploadListener() {
            @Override
            public void onSuccess() {
                mTaskEntity.setTaskStatus(TaskState.TASK_STATUS_FINISH);
                sendHandlerMessage(0, TaskState.TASK_STATUS_FINISH);
                TaskDaoManager.instance().update(mTaskEntity);
//                TaskDaoManager.instance().delete(mTaskEntity);//正常情况下,上传完毕后应从数据库删除任务,demo因测试隐掉这一步
                UploadManager.getInstance().removeTask(mTaskEntity.getTaskId());
            }

            @Override
            public void onError() {
                mTaskEntity.setTaskStatus(TaskState.TASK_STATUS_ERROR);
                TaskDaoManager.instance().update(mTaskEntity);
                sendHandlerMessage(-1, TaskState.TASK_STATUS_ERROR);
                Looper.prepare();
                Toast.makeText(App.getContext(), "上传失败", Toast.LENGTH_SHORT).show();
                Looper.loop();
            }
        });
    }

UploadClient:

public class UploadClient {
    Timer timer = new Timer();
    int progress;

    OnUploadProgress onUploadProgress;

    /**
     * 模拟上传
     */
    public void upload(String path, OnUploadListener onUploadListener) {
        int duration = new Random().nextInt(200);
        timer.schedule(new TimerTask() {
            @Override
            public void run() {
                progress++;
                onUploadProgress.onProgress(progress, 100);
                if (progress >= 100) {
                    timer.cancel();
                    onUploadListener.onSuccess();
                }
            }
        }, 0, duration);
    }

    public void cancel() {
        timer.cancel();
    }

    public void setOnUploadProgress(OnUploadProgress onUploadProgress) {
        this.onUploadProgress = onUploadProgress;
    }

    public interface OnUploadProgress {
        void onProgress(long currentSize, long totalSize);
    }

    public interface OnUploadListener {
        void onSuccess();

        void onError();
    }

}