HarmonyOS三方件開發指南(11)——Updownfile

鴻蒙入門指南,小白速來!從萌新到高手,怎樣快速掌握鴻蒙開發?【課程入口】

目錄:android

1. UpDownfile功能介紹git

2. UpdownFile使用方法github

3. UpdownFile開發實現json

4.《HarmonyOS三方件開發指南》系列文章合集windows

1.  UpDownfile功能介紹
1.1. 功能介紹:
UpDownfile基於Okhttp爲基礎進行二次封裝,是一款很是好用的文件上傳下載框架,該框架功能強大,主要包含兩方面功能:android-studio

(1).文件下載帶進度展現網絡

(A).單任務下載:分爲帶參數和不帶參數,包括暫停下載、繼續下載功能;框架

(B).多任務下載:分爲帶參數和不帶參數,包括暫停下載、繼續下載功能;async

(2).文件上傳帶進度展現ide

(A). 單任務上傳:分爲帶參數和不帶參數,包括暫停上傳、繼續上傳功能;

(B). 多任務上傳:分爲帶參數和不帶參數,包括暫停上傳、繼續上傳功能;

運行截圖以下:

  【軟通動力】HarmonyOS三方件開發指南(11)——Updownfile

【軟通動力】HarmonyOS三方件開發指南(11)——Updownfile

1.2. 使用要求
(1) .在config.json進行網絡以及文件讀寫權限操做

"reqPermissions": [
  {
    "reason": "",
    "name": "ohos.permission.INTERNET"
  },
  {"reason": "",
    "name": "ohos.permission.READ_USER_STORAGE"
  },
  {"reason": "",
    "name": "ohos.permission.READ_MEDIA"
  },
  {"reason": "",
    "name": "ohos.permission.WRITE_USER_STORAGE"
  },
  {"reason": "",
    "name": "ohos.permission.WRITE_MEDIA"
  }
]

(2) .在實際使用地方進行動態權限申請

String[] per = {"ohos.permission.READ_USER_STORAGE", "ohos.permission.WRITE_MEDIA", 
"ohos.permission.READ_MEDIA", "ohos.permission.WRITE_USER_STORAGE"};
requestPermissionsFromUser(per, 0);

1.3. 使用實例介紹UI
 【軟通動力】HarmonyOS三方件開發指南(11)——Updownfile

2.  UpdownFile使用方法
2.1. 新建工程,增長組件Har包依賴
在應用模塊中添加HAR,只須要將updownfile.har複製到entry\libs目錄下便可(因爲build.gradle中已經依賴的libs目錄下的*.har,所以不須要再作修改)。

2.2.  斷點續傳使用方法介紹
(1). 在AbilitySlice裏實現ProgressResponseBody.ProgressListener接口,重寫

@Override
public void onPreExecute(long contentLength) {
    // 文件總長只需記錄一次,要注意斷點續傳後的contentLength只是剩餘部分的長度
    if (this.contentLength == 0L) {
        this.contentLength = contentLength;
        getUITaskDispatcher().asyncDispatch(new Runnable() {
            @Override
            public void run() {
                progressBar.setMaxValue((int) (contentLength / 1024));
            }
        });
    }
}

(2).progressBar設置進度更新的方法以下

@Override
public void update(long totalBytes, boolean done) {
    // 注意加上斷點的長度
    this.totalBytes = totalBytes + breakPoints;
    getUITaskDispatcher().asyncDispatch(new Runnable() {
        @Override
        public void run() {
            progressBar.setProgressValue((int) (totalBytes + breakPoints) / 1024);
        }
    });
    if (done) {
        // 切換到主線程
        getUITaskDispatcher().asyncDispatch(new Runnable() {
            @Override
            public void run() {
                LogUtil.Toast(getAbility(), "下載完成");
            }
        });
    }
}

2.3. 初始化下載方法及存儲路徑

file = new File(getExternalFilesDir(Environment.DIRECTORY_DOWNLOADS), "windows.exe");
downloader = new ProgressDownloader(PACKAGE_URL, file, this);

 

2.4. 具體使用方法
(1). 下載:

breakPoints = 0L;
downloader.download(0L);
LogUtil.Toast(getAbility(), "開始下載");

(2).  暫停,開啓攔截器

downloader.pause();
// 存儲此時的totalBytes,即斷點位置。
breakPoints = totalBytes;
LogUtil.Toast(getAbility(), "下載暫停");

(3). 繼續下載,傳入開始下載的位置

downloader.download(breakPoints);
LogUtil.Toast(getAbility(), "下載繼續");

2.5. 文件上傳使用方法
(1). 單文件上傳,無需參數

/**
 * post請求,上傳單個文件
 * @param url:url
 * @param file:File對象
 * @param fileKey:上傳參數時file對應的鍵
 * @param fileType:File類型,是image,video,audio,file
 * @param callBack:回調接口,onFailure方法在請求失敗時調用,onResponse方法在請求成功後調用,這兩個方法都執行在UI線程。還能夠重寫onProgress方法,獲得上傳進度
 */
public static void okHttpUploadFile(String url, File file,String fileKey, String fileType, CallBackUtil callBack) {
    okHttpUploadFile(url, file, fileKey,fileType, null, callBack);
}

(2). 單文件上傳,須要參數

/**
 * post請求,上傳單個文件
 * @param url:url
 * @param file:File對象
 * @param fileKey:上傳參數時file對應的鍵
 * @param fileType:File類型,是image,video,audio,file
 * @param paramsMap:map集合,封裝鍵值對參數
 * @param callBack:回調接口,onFailure方法在請求失敗時調用,onResponse方法在請求成功後調用,這兩個方法都執行在UI線程。還能夠重寫onProgress方法,獲得上傳進度
 */
public static void okHttpUploadFile(String url, File file, String fileKey,String fileType, Map<String, String> paramsMap, CallBackUtil callBack) {
    okHttpUploadFile(url, file,fileKey, fileType, paramsMap, null, callBack);
}

(3). 多文件上傳, List集合形式

/**
 * post請求,上傳多個文件,以list集合的形式
 * @param url:url
 * @param fileList:集合元素是File對象
 * @param fileKey:上傳參數時fileList對應的鍵
 * @param fileType:File類型,是image,video,audio,file
 * @param paramsMap:map集合,封裝鍵值對參數
 * @param callBack:回調接口,onFailure方法在請求失敗時調用,onResponse方法在請求成功後調用,這兩個方法都執行在UI線程。
 */
public static void okHttpUploadListFile(String url, Map<String, String> paramsMap,List<File> fileList, String fileKey, String fileType,  CallBackUtil callBack) {
    okHttpUploadListFile(url, paramsMap,fileList, fileKey, fileType, null, callBack);
}

(4). 多文件上傳, Map形式

/**
 * post請求,上傳多個文件,以map集合的形式
 * @param url:url
 * @param fileMap:集合key是File對象對應的鍵,集合value是File對象
 * @param fileType:File類型,是image,video,audio,file
 * @param paramsMap:map集合,封裝鍵值對參數
 * @param headerMap:map集合,封裝請求頭鍵值對
 * @param callBack:回調接口,onFailure方法在請求失敗時調用,onResponse方法在請求成功後調用,這兩個方法都執行在UI線程。
 */
public static void okHttpUploadMapFile(String url, Map<String, File> fileMap, String fileType, Map<String, String> paramsMap, Map<String, String> headerMap, CallBackUtil callBack) {
    new RequestUtil(METHOD_POST, url,paramsMap, fileMap, fileType,  headerMap, callBack).execute();
}

3.  UpdownFile開發實現
3.1. 新建一個Module
新建一個Module,類型選擇HarmonyOS Library,模塊名爲updownfile,如圖

【軟通動力】HarmonyOS三方件開發指南(11)——Updownfile

3.2. 新建一個OKhttpUtil類
新建一個OKhttpUtil類,將下載上傳方法進行封裝

【軟通動力】HarmonyOS三方件開發指南(11)——Updownfile

3.3. 新建一個RequestUtil類
RequestUtil實現OkhttpUtil的各類方法

【軟通動力】HarmonyOS三方件開發指南(11)——Updownfile

3.4. 新建CallBackUti實現進度更新監聽
經過EventHandler發送消息對下載進度實現回調監聽,在主線程進行UI更新操做。

【軟通動力】HarmonyOS三方件開發指南(11)——Updownfile

3.5. 多任務下載使用方法
(1).多任務下載原理

建立線程池,點擊單個下載任務建立子線程並將子線程加入線程池進行管理,將文件信息及更新進度信息存入model進行單獨管理,在使用的AblitySlice實現ProgressResponseBody.ProgressListener接口進行進度監聽。
(2). 應用層面使用方法
(A). 引入har包,引入方法這裏不作介紹
(B). 在AblitySlice實現ProgressResponseBody.ProgressListener接口,並重寫接口的兩個方法

@Override
public void onPreExecute(long contentLength,int postion) {
    if (list.get(postion).getBean().getContentLength() == 0L) {
        list.get(postion).getBean().setContentLength(contentLength);
        list.get(postion).getBean().getProgressBar().setMaxValue((int) (contentLength / 1024));
    }
}
@Override
public void update(long totalBytes, boolean done,int postion) {
    list.get(postion).getBean().setTotalBytes(totalBytes+list.get(postion).getBean().getBreakPoints());
    getUITaskDispatcher().asyncDispatch(new Runnable() {
        @Override
        public void run() {
         list.get(postion).getBean().getProgressBar().setProgressValue((int) (list.get(postion).getBean().getTotalBytes()) / 1024);
        }
    });
    if (done) {
        // 切換到主線程
        getUITaskDispatcher().asyncDispatch(new Runnable() {
            @Override
            public void run() {
                LogUtil.Toast(getAbility(), "下載完成");
            }
        });
    }
}

(C) .爲ListContainer建立適配器構造數據,實例以下:

listContainer = (ListContainer) findComponentById(ResourceTable.Id_list);
//造數據
FileBean fileBean1 = new FileBean();
fileBean1.setNum(1);
fileBean1.setUrl("https://dl.google.com/dl/android/studio/install/3.5.2.0/android-studio-ide-191.5977832-windows.exe");
fileBean1.setName("下載一.exe");
fileBean1.setBean(new ProgressBean(null,0,0));
FileBean fileBean2 = new FileBean();
fileBean2.setNum(2);
fileBean2.setUrl("https://dl.google.com/dl/android/studio/install/3.5.2.0/android-studio-ide-191.5977832-windows.exe");
fileBean2.setName("下載二.exe");
fileBean2.setBean(new ProgressBean(null,0,0));
FileBean fileBean3 = new FileBean();
fileBean3.setNum(3);
fileBean3.setUrl("https://dl.google.com/dl/android/studio/install/3.5.2.0/android-studio-ide-191.5977832-windows.exe");
fileBean3.setName("下載三.exe");
fileBean3.setBean(new ProgressBean(null,0,0));
FileBean fileBean4 = new FileBean();
fileBean4.setNum(4);
fileBean4.setUrl("https://dl.google.com/dl/android/studio/install/3.5.2.0/android-studio-ide-191.5977832-windows.exe");
fileBean4.setName("下載四.exe");
fileBean4.setBean(new ProgressBean(null,0,0));
list.add(fileBean1);
list.add(fileBean2);
list.add(fileBean3);
list.add(fileBean4);
//初始化適配器
listItemProvider = new ListItemProvider(list,this,this);
//設置適配器
listContainer.setItemProvider(listItemProvider);

(D). 在ListContainer的適配器的構造方法中進行線程池初始化

threadTask= new ThreadTask(ability);


(E).點擊開始下載,建立子線程,並將子線程加入線程池進行管理
   

threadTask.CreatTask(postion,downloader);


(F).暫停下載方法使用以下:
 

list.get(i).getProgressDownloader().pause();
// 存儲此時的totalBytes,即斷點位置。  list.get(i).getBean().setBreakPoints(list.get(i).getBean().getTotalBytes());

 (G). 繼續下載方法使用以下:

list.get(i).getProgressDownloader().download(list.get(i).getBean().getBreakPoints());


(H). 特別注意,點擊暫停時,必須將當前下載的節點進行存儲,由於該節點在從新下載時會看成     下載的起始位置。存儲方法以下

list.get(i).getBean().setBreakPoints(list.get(i).getBean().getTotalBytes());


 3.6.  編譯HAR包
利用Gradle能夠將HarmonyOS Library庫模塊構建爲HAR,構建HAR的方法以下:

在Gradle構建任務中,HAR包括生產和測試版本,雙擊PackageDebugHar或PackageReleaseHar任務,構建Debug或Release類型的HAR。

待構建任務完成後,能夠在工程目錄中的updownfile> bulid > outputs > har目錄中,獲取生成的HAR。

【軟通動力】HarmonyOS三方件開發指南(11)——Updownfile

項目源代碼地址:https://github.com/isoftstone-dev/FileDownload_HarmonyOS

歡迎交流:HWIS-HOS@isoftstone.com

做者:軟通田可輝

想了解更多內容,請訪問: 51CTO和華爲官方戰略合做共建的鴻蒙技術社區https://harmonyos.51cto.com

相關文章
相關標籤/搜索