支持功能:
- 多任务批量上传;
- 上传状态储存(结合数据库);
- 进度监听(需具体网络上传框架支持,如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();
}
}