热门标签 | HotTags
当前位置:  开发笔记 > 开放平台 > 正文

android递归压缩上传多张图片到七牛的实例代码

最近遇到这样一个需求:要做一个仿微信朋友圈的功能,要求上传最多九张图到七牛。七牛有上传图片的接口,但是每次只能上传一张。如果是九张图片一齐上

最近遇到这样一个需求:要做一个仿微信朋友圈的功能,要求上传最多九张图到七牛。七牛有上传图片的接口,但是每次只能上传一张。如果是九张图片一齐上传,使用for循环的话肯定不行的,很容易出错。因为上传七牛的动作是在子线程完成的,for循环是在主线程的,这就相当于同时开启十个子线程来上传图片,而且都是耗时线程,很容易会ANR的。

最好的解决办法应该是先压缩图片,在200k-300k之间,保证图片不失真,然后一张一张上传,通过七牛的回调,来判断上一张图片是否上传完成,上传完成了,再上传下一张图片。

好了,话不多说,贴代码:

1.压缩图片

/**
   * 质量压缩法
   *
   * @param image
   * @return
   */
  public byte[] compressImage(Bitmap image) {
    ByteArrayOutputStream baos = new ByteArrayOutputStream();
    image.compress(Bitmap.CompressFormat.JPEG, 100, baos);//质量压缩方法,这里100表示不压缩,把压缩后的数据存放到baos中
    int optiOns= 100;
    while (baos.toByteArray().length / 1024 > 250) { //循环判断如果压缩后图片是否大于100kb,大于继续压缩
      baos.reset();//重置baos即清空baos
      image.compress(Bitmap.CompressFormat.JPEG, options, baos);//这里压缩options%,把压缩后的数据存放到baos中
      options -= 10;//每次都减少10
      if (options <= 10) {
        break;
      }
    }
    byte[] byteArray = baos.toByteArray();
    try {
      if (baos != null) {
        baos.close();
      }
    } catch (IOException e) {
      e.printStackTrace();
    }
    return byteArray;
  }

这个之前是压缩到100k的,这个没有按比例压缩,有的图片尺寸比较大的会模糊,所以现在调整到250k,估计压缩的图片大小会在200-300k左右吧。

2.递归上传图片

/**
   * 递归上传图片主要方法
   * @param picUrl 图片的本地路径
   * @param picSize 上传图片总数量
   *        //picNum是计数器,用于计算已上传图片的数目
   *        //snplMomentAddPhotos.getData().get(picNum)是选择图片的开源库,返回一个ArrayList类型的图片路径
   *        BitmapUnit.getInstance().compressImage(BitmapUnit.getInstance().getBItmap(picUrl))//压缩图片
   *        
   */
  private void upPic(String picUrl, int picSize) {
    //根据七牛上传图片的api,封装的上传方法
    QiniuUtils.getInstance().uploadSmallFile(BitmapUnit.getInstance().
            compressImage(BitmapUnit.getInstance().getBItmap(picUrl)),
        url -> {
          //图片成功上传到七牛时回调
          //当前完成上传的图片数量小于总图片数量的时候重新调用该方法递归
          if (picNum 

这个代码不难看懂,具体的都写在注释里面了,有一些是项目里面用到的,各位看官只要明确在哪里调用方法进行递归和在哪里添加计数器,在哪里结束递归就可以了。

但是这个方法有一点小瑕疵,正常我们在上传图片的过程中,都要有加载进度条,我发现加载进度条在每次上传成功的时候都会稍微卡一下。初步推断是因为压缩图片引起的,压缩图片的时候也是比较耗能的,而且同在主线程,会引起卡顿。提出的解决方案是:把图片压缩部分提出来,放在子线程中,先压缩图片,然后在同意上传。不过还没来的及优化,当然各位如果有什么好的想法,请提出来。感激不尽。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。


推荐阅读
  • 数据管理权威指南:《DAMA-DMBOK2 数据管理知识体系》
    本书提供了全面的数据管理职能、术语和最佳实践方法的标准行业解释,构建了数据管理的总体框架,为数据管理的发展奠定了坚实的理论基础。适合各类数据管理专业人士和相关领域的从业人员。 ... [详细]
  • 新冠肺炎疫情期间,各大银行积极利用手机银行平台,满足客户在金融与生活多方面的需求。线上服务不仅激活了防疫相关的民生场景,还推动了银行通过互联网思维进行获客、引流与经营。本文探讨了银行在找房、买菜、打卡、教育等领域的创新举措。 ... [详细]
  • SQLite 动态创建多个表的需求在网络上有不少讨论,但很少有详细的解决方案。本文将介绍如何在 Qt 环境中使用 QString 类轻松实现 SQLite 表的动态创建,并提供详细的步骤和示例代码。 ... [详细]
  • 从零开始构建完整手机站:Vue CLI 3 实战指南(第一部分)
    本系列教程将引导您使用 Vue CLI 3 构建一个功能齐全的移动应用。我们将深入探讨项目中涉及的每一个知识点,并确保这些内容与实际工作中的需求紧密结合。 ... [详细]
  • 阅读本文大约需要3分钟。微信8.0版本的发布带来了许多令人振奋的新功能,如烟花特效和改进的悬浮窗,引发了用户的热烈反响。 ... [详细]
  • 本文详细介绍如何在微信商户平台上下载支付操作证书,并将其正确配置到支付账户中。包括登录步骤、密码重置以及证书上传的具体操作。 ... [详细]
  • 微信历史头像查询指南:轻松找回旧头像
    您是否想查看之前使用过的微信头像?本文将详细介绍如何通过简单步骤找回您的历史头像。不仅如此,我们还会提供一些实用技巧和注意事项,帮助您更好地管理个人资料。 ... [详细]
  • 射频系统中IM3、IIP3、OIP3、增益和P1dB的关系解析
    本文探讨了噪声系数与非线性失真对射频系统性能的影响,详细分析了IM3、IIP3、OIP3、增益(G)和1dB压缩点(P1dB)之间的关系,并提供了相关公式和图表解释。 ... [详细]
  • 本文将深入探讨PHP编程语言的基本概念,并解释PHP概念股的含义。通过详细解析,帮助读者理解PHP在Web开发和股票市场中的重要性。 ... [详细]
  • 本文探讨了将类成员属性设置为私有的重要性,并通过具体代码示例展示了如何实现对这些属性的有效控制。私有成员属性有助于增强数据的安全性和完整性,确保只有经过验证的数据才能被修改。 ... [详细]
  • 易飞扬宣布推出新型低成本100G OTU4光模块,以满足DPI市场的需求。新产品包括100G CFP2 LR4 10KM和100G OTU4 QSFP28 LR4光模块,具备低功耗和高性能特点。 ... [详细]
  • 本文深入探讨了计算机网络的基础概念和关键协议,帮助初学者掌握网络编程的必备知识。从网络结构到分层模型,再到传输层协议和IP地址分类,文章全面覆盖了网络编程的核心内容。 ... [详细]
  • 在众多不为人知的软件中,这些工具凭借其卓越的功能和高效的性能脱颖而出。本文将为您详细介绍其中八款精品软件,帮助您提高工作效率。 ... [详细]
  • 深入解析TCP/IP五层协议
    本文详细介绍了TCP/IP五层协议模型,包括物理层、数据链路层、网络层、传输层和应用层。每层的功能及其相互关系将被逐一解释,帮助读者理解互联网通信的原理。此外,还特别讨论了UDP和TCP协议的特点以及三次握手、四次挥手的过程。 ... [详细]
  • 本文详细介绍了网络存储技术的基本概念、分类及应用场景。通过分析直连式存储(DAS)、网络附加存储(NAS)和存储区域网络(SAN)的特点,帮助读者理解不同存储方式的优势与局限性。 ... [详细]
author-avatar
wangtao
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有