Retrofit2+rxjava2+Mvp基于okhttp3网络请求框架的使用 一 框架配置
Retrofit2+rxjava2+Mvp基于okhttp3网络请求框架的使用 二 请求数据
Retrofit2+rxjava2+Mvp基于okhttp3网络请求框架的使用 三 文件上传(支持多文件上传)
Retrofit2+rxjava2+Mvp基于okhttp3网络请求框架的使用 四 下载文件
以图片下载为例
第一步:添加下载地址接口
@GET
@Streaming
fun downloadImg(@Url imgUrl: String): Observable<ResponseBody>
第二步:添加请求方法实例
/**
* 指定线程下载文件(异步),非阻塞式下载
* @param url 图片url
*/
private fun downloadFile(
url: String
) {
RetrofitHelper.getApi()
.downloadImg(url)
.subscribeOn(Schedulers.io())
.observeOn(Schedulers.newThread())
.subscribe(object : DisposableObserver<ResponseBody?>() {
override fun onNext(responseBody: ResponseBody) {
var bitmap: Bitmap? = null
val bys: ByteArray
try {
bys = responseBody.bytes()
bitmap = BitmapFactory.decodeByteArray(bys, 0, bys.size)
if (bitmap == null) {
return
}
try {
Utils.saveImg(bitmap, "本地路径", "文件名称" )
} catch (e: IOException) {
e.printStackTrace()
}
} catch (e: IOException) {
e.printStackTrace()
}
bitmap?.recycle()
}
override fun onError(e: Throwable) {
//下载异常
}
override fun onComplete() {
//下载完成
}
})
}
第三步:保存到本地
/**
* 保存图片到SD卡
* @param bm 图片bitmap对象
* @param floderPath 下载文件保存目录
* @param fileName 文件名称(不带后缀)
*/
fun saveImg(bm: Bitmap, floderPath: String, fileName: String) {
//如果不保存在sd下面下面这几行可以不加
if (Environment.getExternalStorageState() != Environment.MEDIA_MOUNTED) {
return
}
val folder = File(floderPath)
if (!folder.exists()) {
folder.mkdirs()
}
val savePath = floderPath + File.separator + fileName + ".jpg"
val file = File(savePath)
val bos = BufferedOutputStream(FileOutputStream(file))
bm.compress(Bitmap.CompressFormat.JPEG, 80, bos)
bos.flush()
bos.close()
}