日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 运维知识 > Android >内容正文

Android

android上传图片文件至c 服务器,Android 史上最优雅的实现文件上传、下载及进度的监听...

發(fā)布時(shí)間:2023/12/10 Android 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 android上传图片文件至c 服务器,Android 史上最优雅的实现文件上传、下载及进度的监听... 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

本文已授權(quán)「劉望舒」微信公眾號(hào)獨(dú)家原創(chuàng)發(fā)布

前言

本文將直接使用RxHttp庫(kù)實(shí)現(xiàn)文件上傳、下載、斷點(diǎn)下載、進(jìn)度的監(jiān)聽(tīng),不對(duì)RxHttp做過(guò)多講解,如果對(duì)RxHttp不了解,請(qǐng)移步

本文目的在于讓更多的讀者知道RxHttp庫(kù),如果您已閱讀上面4篇文章,本文可直接跳過(guò),感謝你的支持。🙏🙏。

上傳

RxHttp.postForm("http://...") //發(fā)送Form表單形式的Post請(qǐng)求

.add("key", "value")

.add("file1", new File("xxx/1.png")) //添加file對(duì)象

.add("file2", new File("xxx/2.png"))

.asString() //asXXX操作符,是異步操作

.as(RxLife.asOnMain(this)) //感知生命周期,并在主線程回調(diào)

.subscribe(s -> {

//上傳成功,拿到Http返回值,這里返回值為String類型

}, throwable -> {

//上傳失敗

});

復(fù)制代碼

注:如果需要對(duì)Http的返回值做解析,可在使用asParser操作符時(shí),傳入一個(gè)解析器Parser

帶進(jìn)度上傳

帶進(jìn)度上傳使用asUpload(Progress,Scheduler)操作符

RxHttp.postForm("http://www.......") //發(fā)送Form表單形式的Post請(qǐng)求

.add("key1", "value1")//添加參數(shù),非必須

.add("file1", new File("xxx/1.png"))

.asUpload(progress -> {

//上傳進(jìn)度回調(diào),0-100,僅在進(jìn)度有更新時(shí)才會(huì)回調(diào),最多回調(diào)101次,最后一次回調(diào)Http執(zhí)行結(jié)果

int currentProgress = progress.getProgress(); //當(dāng)前進(jìn)度 0-100

long currentSize = progress.getCurrentSize(); //當(dāng)前已上傳的字節(jié)大小

long totalSize = progress.getTotalSize(); //要上傳的總字節(jié)大小

}, AndroidSchedulers.mainThread())//指定主線程回調(diào)

.as(RxLife.as(this)) //感知生命周期

.subscribe(s -> { //s為String類型,由SimpleParser類里面的泛型決定的

//上傳成功,處理相關(guān)邏輯

}, throwable -> {

//上傳失敗,處理相關(guān)邏輯

});

復(fù)制代碼

注:如果需要對(duì)Http的返回值做解析,可使用asUpload(Parser,Progress,Scheduler)方法,傳入一個(gè)解析器Parser

下載

//文件存儲(chǔ)路徑

String destPath = getExternalCacheDir() + "/" + System.currentTimeMillis() + ".apk";

RxHttp.get("http://update.9158.com/miaolive/Miaolive.apk")

.asDownload(destPath) //注意這里使用asDownload操作符,并傳入本地路徑

.as(RxLife.asOnMain(this)) //感知生命周期,并在主線程回調(diào)

.subscribe(s -> {

//下載成功,回調(diào)文件下載路徑

}, throwable -> {

//下載失敗

});

復(fù)制代碼

帶進(jìn)度下載

帶進(jìn)度下載使用asDownload(String,Consumer,Scheduler)方法

//文件存儲(chǔ)路徑

String destPath = getExternalCacheDir() + "/" + System.currentTimeMillis() + ".apk";

RxHttp.get("http://update.9158.com/miaolive/Miaolive.apk")

.asDownload(destPath, progress -> {

//下載進(jìn)度回調(diào),0-100,僅在進(jìn)度有更新時(shí)才會(huì)回調(diào),最多回調(diào)101次,最后一次回調(diào)文件存儲(chǔ)路徑

int currentProgress = progress.getProgress(); //當(dāng)前進(jìn)度 0-100

long currentSize = progress.getCurrentSize(); //當(dāng)前已下載的字節(jié)大小

long totalSize = progress.getTotalSize(); //要下載的總字節(jié)大小

}, AndroidSchedulers.mainThread()) //指定主線程回調(diào)

.as(RxLife.as(this)) //感知生命周期

.subscribe(s -> {//s為String類型,這里為文件存儲(chǔ)路徑

//下載完成,處理相關(guān)邏輯

}, throwable -> {

//下載失敗,處理相關(guān)邏輯

});

復(fù)制代碼

斷點(diǎn)下載

斷點(diǎn)下載相較于下載,僅需要調(diào)用setRangeHeader方法傳入開(kāi)始及結(jié)束位置即可(結(jié)束位置不傳默認(rèn)為文件末尾),其它沒(méi)有任何差別

String destPath = getExternalCacheDir() + "/" + "Miaobo.apk";

long length = new File(destPath).length(); //已下載的文件長(zhǎng)度

RxHttp.get("http://update.9158.com/miaolive/Miaolive.apk")

.setRangeHeader(length) //設(shè)置開(kāi)始下載位置,結(jié)束位置默認(rèn)為文件末尾

.asDownload(destPath)

.as(RxLife.asOnMain(this)) //加入感知生命周期的觀察者

.subscribe(s -> { //s為String類型

Log.e("LJX", "breakpointDownloadAndProgress=" + s);

//下載成功,處理相關(guān)邏輯

}, throwable -> {

//下載失敗,處理相關(guān)邏輯

});

復(fù)制代碼

帶進(jìn)度斷點(diǎn)下載

帶進(jìn)度斷點(diǎn)下載相較于帶進(jìn)度下載僅需要調(diào)用setRangeHeader方法傳入開(kāi)始及結(jié)束位置即可(結(jié)束位置不傳默認(rèn)為文件末尾),其它沒(méi)有任何差別

String destPath = getExternalCacheDir() + "/" + "Miaobo.apk";

long length = new File(destPath).length(); //已下載的文件長(zhǎng)度

RxHttp.get("http://update.9158.com/miaolive/Miaolive.apk")

.setRangeHeader(length) //設(shè)置開(kāi)始下載位置,結(jié)束位置默認(rèn)為文件末尾

.asDownload(destPath, progress -> {

//下載進(jìn)度回調(diào),0-100,僅在進(jìn)度有更新時(shí)才會(huì)回調(diào)

int currentProgress = progress.getProgress(); //當(dāng)前進(jìn)度 0-100

long currentSize = progress.getCurrentSize(); //當(dāng)前已下載的字節(jié)大小

long totalSize = progress.getTotalSize(); //要下載的總字節(jié)大小

}, AndroidSchedulers.mainThread()) //指定主線程回調(diào)

.as(RxLife.as(this)) //加入感知生命周期的觀察者

.subscribe(s -> { //s為String類型

//下載成功,處理相關(guān)邏輯

}, throwable -> {

//下載失敗,處理相關(guān)邏輯

});

復(fù)制代碼

注:上面帶進(jìn)度斷點(diǎn)下載中,返回的進(jìn)度會(huì)從0開(kāi)始,如果需要銜接上次下載的進(jìn)度,則調(diào)用asDownload(String,long,Consumer,Scheduler)方法傳入上次已經(jīng)下載好的長(zhǎng)度(第二個(gè)參數(shù)),如下:

String destPath = getExternalCacheDir() + "/" + "Miaobo.apk";

long length = new File(destPath).length(); //已下載的文件長(zhǎng)度

RxHttp.get("http://update.9158.com/miaolive/Miaolive.apk")

.setRangeHeader(length) //設(shè)置開(kāi)始下載位置,結(jié)束位置默認(rèn)為文件末尾

.asDownload(destPath, length, progress -> {

//下載進(jìn)度回調(diào),0-100,僅在進(jìn)度有更新時(shí)才會(huì)回調(diào)

int currentProgress = progress.getProgress(); //當(dāng)前進(jìn)度 0-100

long currentSize = progress.getCurrentSize(); //當(dāng)前已下載的字節(jié)大小

long totalSize = progress.getTotalSize(); //要下載的總字節(jié)大小

}, AndroidSchedulers.mainThread()) //指定主線程回調(diào)

.as(RxLife.as(this)) //加入感知生命周期的觀察者

.subscribe(s -> { //s為String類型

//下載成功,處理相關(guān)邏輯

}, throwable -> {

//下載失敗,處理相關(guān)邏輯

});

復(fù)制代碼

多任務(wù)下載

多任務(wù)下載我們可以使用RxJava的merge操作符,如下:

List> downList = new ArrayList<>();

for (int i = 0; i < 3; i++) {

String destPath = getExternalCacheDir() + "/" + i + ".apk";

String url = "http://update.9158.com/miaolive/Miaolive.apk"

Observable down = RxHttp.get(url)

.asDownload(destPath);

downList.add(down);

}

//通過(guò)RxJava內(nèi)部線程池,多任務(wù)并行下載

Observable.merge(downList)

.as(RxLife.as(this))

.subscribe(s -> {

//單個(gè)任務(wù)下載完成

}, throwable -> {

//下載出錯(cuò)

}, () -> {

//所有任務(wù)下載完成

});

復(fù)制代碼

如果想監(jiān)聽(tīng)每個(gè)任務(wù)的下載進(jìn)度,也簡(jiǎn)單,用老方法即可,如下:

List> downList = new ArrayList<>();

for (int i = 0; i < 3; i++) {

String destPath = getExternalCacheDir() + "/" + i + ".apk";

String url = "http://update.9158.com/miaolive/Miaolive.apk"

Observable down = RxHttp.get(url)

.asDownload(destPath, progress -> {

//單個(gè)下載任務(wù)進(jìn)度回調(diào)

}, AndroidSchedulers.mainThread())

downList.add(down);

}

//通過(guò)RxJava內(nèi)部線程池,多任務(wù)并行下載

Observable.merge(downList)

.as(RxLife.as(this))

.subscribe(s -> {

//單個(gè)任務(wù)下載完成

}, throwable -> {

//下載出錯(cuò)

}, () -> {

//所有任務(wù)下載完成

});

復(fù)制代碼

多任務(wù)上傳

與多任務(wù)下載同理,不再講述。

小結(jié)

好了,文件上傳、下載相關(guān)就介紹到這里了,到這你會(huì)發(fā)現(xiàn),不管是上傳還是下載,進(jìn)度的監(jiān)聽(tīng)都極其的相似,極大的降低了學(xué)習(xí)成本。怎么樣?是不是很優(yōu)雅,歡迎打臉!!

最后,很大一部分功勞都要?dú)w功于RxJava的強(qiáng)大,感謝RxJava,向它致敬!!!!

下一文將繼續(xù)使用RxJava強(qiáng)大的操作符,看看它與RxHttp又能擦出怎樣的火花。

轉(zhuǎn)載請(qǐng)注明出處,謝謝🙏

創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來(lái)咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)

總結(jié)

以上是生活随笔為你收集整理的android上传图片文件至c 服务器,Android 史上最优雅的实现文件上传、下载及进度的监听...的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。