Android Retrofit2+rxjava2+Mvp基于okhttp3网络请求框架的使用 四 文件下载(图片下载为例)

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()
    }
注意:这里的代码需要前面的配置支持,希望伙伴们可以看下第一篇, 在整个框架配置完成之后 后面的操作都很简单,有问题的地方或者有什么问题,大家可以留言
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值