项目场景:

Android开发时使用OkHttp等相关网络框架与后端完成网络通信,完成上传或下载图片功能。



Bug1:

通过Intent获取图片,并使用OkHttp将其传输到后端,发现后端未收到Http请求(即请求丢失)。进而导致OkHttp中onResponse回调发生异常情况,发生返回数据丢失等情况。


原因分析:

发送的图片过大,导致OkHttp未能将请求发送出去。
(不知道是不是根本原因,但将图片发送前进行压缩确实能完成正常的请求发送)


解决方案:

发送前将图片等文件进行压缩,压缩完成后再将其加入到RequestsBody中进行数据发送。
并且使用Android传输大尺寸图片也是毫无意义的,因为Android本身也并不能显示出那些动辄上十兆的图片。
在此提供一个相对好用的文件压缩第三方库:Compressor



Bug2:

利用OkHttp请求图片,并将其加载到ImageView中时图片不能显示。
通常伴随相关错误或警告:

  • Failed to create image decoder with message 'unimplemented'
  • android.graphics.ImageDecoder$DecodeException: Failed to create image decoder with message 'unimplemented'Input contained an error.

实际上在开发时你很可能看不到第二个错误,而只会在网络请求回调执行中图片加载不出来时看到第一种形式的警告(这个警告极其不显眼,一般情况下你甚至不会注意到它)。两种形式对应的是同一种错误。


原因分析:

请求返回的数据流过大,直接使用该数据流生成Bitmap格式的图片生成失败。(可能原因)


解决方案:

不要直接调用BitmapFactory.decodeStream(stream),而是先将返回的数据流保存到本地文件 (若接收的是图片,则保存时最好对其进行压缩),并通过调用本地文件的Uri来使用其数据。

可在回调中尝试如下方案:

 val call = client.newCall(request)call.enqueue(object : Callback {// UI的更新需要在UI线程中更新, runOnUiThreadoverride fun onFailure(call: Call?, e: IOException?) {e?.printStackTrace()activity?.runOnUiThread {Toast.makeText(context, "照片处理失败,请稍后重试", Toast.LENGTH_SHORT).show()loadingDialog.dismiss()}}override fun onResponse(call: Call?, response: Response) {val stream = response.body()!!.byteStream()val fType = context.contentResolver.getType(img.toUri()) ?: "jpg"// 将数据流保存到本地,最好同时对其进行压缩处理val bitmap: File = streamToFile(context, stream, fType)activity?.runOnUiThread {view?.findViewById<ImageView>(R.id.imageView)?.setImageURI(bitmap.toUri())Toast.makeText(context, "照片处理完成", Toast.LENGTH_SHORT).show()loadingDialog.dismiss()}}})

Android 图片下载或上传时请求失败。相关推荐

  1. 支付宝小程序编译打包时, 使用tnpm安装依赖可能导致上传时构建失败,请使用 \tnpm i --by=yarn\ 安装依赖

    1.最近做支付宝小程序,不太懂,因为用了mini-ali-ui,所以打包出现了Packed fail. ========== 远程调试构建失败 ========== build & pack ...

  2. 大文件上传时如何做到秒传?

    本文已经收录到Github仓库,该仓库包含计算机基础.Java基础.多线程.JVM.数据库.Redis.Spring.Mybatis.SpringMVC.SpringBoot.分布式.微服务.设计模式 ...

  3. 大文件上传时如何做到秒传?(荣耀典藏版)

    目录 前言 一.秒传 1.什么是秒传 2.本文实现的秒传核心逻辑 二.分片上传 1.什么是分片上传 2.分片上传的场景 三.断点续传 1.什么是断点续传 2.应用场景 3.实现断点续传的核心逻辑 4. ...

  4. android+nutz后台如何上传和下载图片

    android+nutz后台如何上传和下载图片 发布于 588天前  作者 yummy222  428 次浏览  复制  上一个帖子  下一个帖子  标签: 无 最近在做一个基于android的app ...

  5. layui上传文件请求接口异常_SpringMVC实现文件上传与下载,拦截器,异常处理

    第一章:响应数据和结果视图 1. 返回字符串 Controller方法返回字符串可以指定逻辑视图的名称,根据视图解析器为物理视图的地址. @RequestMapping(value="/he ...

  6. Android 使用FTP实现上传、下载等功能

    一.前言 最近在项目中遇到使用到FTP上传和下载资源,特此记录一下实现的方式.Android实现FTP的功能主要用到了Apache的Commons Net库,将Commons Net的jar包下载引入 ...

  7. iOS:图片上传时两种图片压缩方式的比较

    上传图片不全面的想法:把图片保存到本地,然后把图片的路径上传到服务器,最后又由服务器把路径返回,这种方式不具有扩展性,如果用户换了手机,那么新手机的沙盒中就没有服务器返回的图片路径了,此时就无法获取之 ...

  8. 淘宝店铺上新图片上传获取请求方法

    淘宝上新图片上传获取请求方法如下: 1.请求方法:POST [支持高并发同时请求] 点击获取请求key和secret Headers: 参数名称 参数值 是否必须 示例 备注 Content-Type ...

  9. SpringBoot 搭建图片服务器 -- 支持上传下载和浏览

    前言: 项目需求:做一个图片服务器,用于存放业务部门做的宣传图片:支持上传.下载和在线查看. 一.需求分解 1. 上传.下载功能比较成熟,相对好实现: 2. 在线预览,需要分为单个文件预览和多个文件预 ...

最新文章

  1. [名词解释] RIAD磁盘阵列
  2. python调用函数出现未定义_python – 为什么函数参数之外的“self”会给出“未定义”的错误?...
  3. Smobiler实现扫描条码和拍照功能(开发日志八)
  4. 利剑无意之Dubbo 面试题
  5. mysql 记录更新 内部_MySQL 入门(1):查询和更新的内部实现
  6. 『数据库』朴实无华且枯燥的数据库文章--关系数据理论
  7. token验证_如何利用 C# 爬取带 Token 验证的网站数据?
  8. python 线程异步执行踩坑
  9. 深入Atlas系列:Web Sevices Access in Atlas示例(4) - 使用HTTP GET调用Web Services方法...
  10. java 对象和类
  11. TensorFlow实现条件批归一化(Conditional Batch Normalization)
  12. 7-1 Say Hello to Integers (5 分)
  13. 关于codeMirror插件使用的一个坑
  14. Servlet四种访问属性--知识点
  15. dps软件计算机64位的安装,DPS数据处理系统
  16. Unix网络编程学习笔记
  17. vmware 无人参与应答文件包含的产品密钥无效
  18. 图像处理:图像特效之油画效果
  19. IE网页截图技术笔记
  20. 架构师,你需要了解的git知识都在这里了

热门文章

  1. 一个游戏程序员必须要读的书
  2. SpringSecurity Oauth2 认证授权(二)springboot快速入门与底层介绍
  3. cnki登录显示服务器或网络异常,知网查重官网为什么无法登录?
  4. 【过往】百度网盘七年纪
  5. 来看看中国计算机视觉行业发展有什么动态?
  6. 小孩发烧怎么办 - 强烈建议查看转载内容的详情,看视频介绍
  7. 微信支付API v3 Native支付
  8. 模拟电路设计的九个级别 (ZT)!!!
  9. 区块链存证原理与流程--基于xuperchain司法存证系统开发的学习笔记
  10. c不能做oracle关键字,C语言中的关键字不能作变量名,但可以作为函数名。