1. 程式人生 > >Android 大檔案分片上傳斷點續傳任務管理實現

Android 大檔案分片上傳斷點續傳任務管理實現

Transer

是一個傳輸框架,目前支援:
- 支援 HTTP/HTTPS 斷點續傳下載
- 支援 HTTP/HTTPS 大檔案分片上傳
- 支援 類EventBus的task狀態變更通知,支援三種執行緒的訂閱模式
- 支援 任務分組,分使用者

設計

架構

簡單的下載或上傳:

下載:
““ java
mHandler = new DefaultHttpDownloadHandler();
//建立一個任務
ITask task = new TaskBuilder()
.setName(“test.zip”) //設定任務名稱
.setDataSource(URL) //設定資料來源
.setDestSource(FILE_PATH) //設定目標路徑
.build();
mHandler.setTask(task);

    //設定請求引數
    Map<String,String> params = new HashMap<>();
    params.put("path","test.zip");
    mHandler.setParams(params);
    mHandler.setHandlerListenner(new SimpleTaskHandlerListenner());

    //設定一個執行緒池去下載檔案,如果不設定,則會在當前執行緒進行下載。
    ThreadPoolExecutor threadPool = new ThreadPoolExecutor(3,3,
            6000, TimeUnit.MILLISECONDS,new ArrayBlockingQueue<Runnable>(10000));
    mHandler.setThreadPool(threadPool);


上傳:
java
mHandler = new DefaultHttpUploadHandler();
//建立一個任務
ITask task = new TaskBuilder()
.setName(“test.zip”) //設定任務名稱
.setDataSource(FILE_PATH) //設定資料來源
.setDestSource(URL) //設定目標路徑
.build();
mHandler.setTask(task);

    //設定請求引數
    Map<String,String> params = new HashMap<>();
    params.put("path","test.zip");
    mHandler.setParams(params);
    mHandler.setHandlerListenner(new SimpleTaskHandlerListenner());

    //設定一個執行緒池去上傳檔案,如果不設定,則會在當前執行緒進行上傳。
    ThreadPoolExecutor threadPool = new ThreadPoolExecutor(3,3,
            6000, TimeUnit.MILLISECONDS,new ArrayBlockingQueue<Runnable>(10000));
    mHandler.setThreadPool(threadPool);

““

使用任務管理:

1.建立任務

““ java
ITask task = new TaskBuilder()
.setTaskType(task_type) //任務型別
.setDataSource(source) //任務資料來源 (下在任務為要下載的服務檔案連結,上傳任務為要上傳的本地檔案路徑)
.setDestSource(dest) //任務目標源 (下載任務為儲存的本地路徑,上傳任務為伺服器地址)
.setName(NAME) //任務名稱
.build();

    ITaskCmd cmd = new TaskCmdBuilder()
            .setTaskType(task_type) //任務型別
            .setProcessType(ProcessType.TYPE_ADD_TASK) //操作型別(新增任務)
            .setTask(task) //任務資訊
            .build();

    TaskEventBus.getDefault().execute(cmd); //執行命令

““
2.開始任務

““ java
ITaskCmd cmd = new TaskCmdBuilder()
.setTaskType(task_type) //任務型別
.setState(TaskState.STATE_START)
.setProcessType(ProcessType.TYPE_CHANGE_TASK) //操作型別(新增任務)
.setTask(task) //任務資訊
.build();

    TaskEventBus.getDefault().execute(cmd); //執行命令


3.結束/暫停 任務
java
ITaskCmd cmd = new TaskCmdBuilder()
.setTaskType(task_type) //任務型別
.setState(TaskState.STATE_START)
.setProcessType(ProcessType.TYPE_CHANGE_TASK) //操作型別(新增任務)
.setTask(task) //任務資訊
.build();

    TaskEventBus.getDefault().execute(cmd); //執行命令

““
4.接收任務變更通知
- 在Activity,Fragement,Service,Dialog 等 onResume 或 onStart 中:

java
TaskEventBus.getDefault().regesit(this);

- 在 onPause , onStop 中使用

java
TaskEventBus.getDefault().unregesit(this);

- 新增一個方法,引數為List tasks,並且添加註解TaskSubscriber

java
@TaskSubscriber
public void onTasksChanged(List<ITask> tasks) {
//TODO update ui on any processtype
}


  • TaskScriber

預設情況下TaskScriber 會接受所有任務變更的訊息,也可以指定只接受某個操作的訊息例如:
java
@TaskSubscriber(taskType = TYPE_DOWNLOAD, processType = TYPE_CHANGE_TASK)
public void onTasksChanged(List<ITask> tasks) {
//TODO update ui in posting thread
}

也可以指定訊息接收的執行緒,預設為傳送訊息的執行緒,例如:

java
@TaskSubscriber(taskType = TYPE_DOWNLOAD, processType = TYPE_CHANGE_TASK,threadMode = ThreadMode.MODE_MAIN)
public void onTasksChanged(List<ITask> tasks) {
//TODO update ui in main thread
}

配置傳輸服務(TranferService的onCreate 中)

““ java
TaskEventBus.init(getApplicationContext()); //初始化訊息管理器
DaoHelper.init(getApplicationContext()); //初始化資料庫
mContext = getApplicationContext();

    mTaskManagerProxy = new TaskManagerProxy();  
    mTaskManagerProxy.setProcessCallback(this);
    //Taskprocessor 為在記憶體中處理任務,TaskdDbProcessor 為資料庫操作, 可以 實現ITaskProcessor 替換預設處理器
    mTaskManagerProxy.setTaskProcessor(new TaskProcessorProxy(new TaskProcessor(),new TaskDbProcessor())); 

    mTaskManagerProxy.setTaskManager(new TaskManager()); 
    //可以繼承BaseTaskHandler 實現新的傳輸處理器
    mTaskManagerProxy.setTaskHandler(TaskType.TYPE_HTTP_DOWNLOAD, DefaultHttpDownloadHandler.class); //設定下載器
    mTaskManagerProxy.setTaskHandler(TaskType.TYPE_HTTP_UPLOAD, DefaultHttpUploadHandler.class); //設定上傳器

    ThreadPoolExecutor threadPool = new ThreadPoolExecutor(3,3,
            6000, TimeUnit.MILLISECONDS,new ArrayBlockingQueue<Runnable>(10000));
    mTaskManagerProxy.setThreadPool(TaskType.TYPE_HTTP_UPLOAD, threadPool);//設定上傳執行緒池

    threadPool = new ThreadPoolExecutor(3,3,
            6000, TimeUnit.MILLISECONDS,new ArrayBlockingQueue<Runnable>(10000));
    mTaskManagerProxy.setThreadPool(TaskType.TYPE_HTTP_DOWNLOAD,threadPool); //下載執行緒池

    mTaskManagerProxy.setHeaders(new HashMap<String, String>()); //設定請求頭
    mTaskManagerProxy.setParams(new HashMap<String, String>()); //設定url引數

““