Luban-Circle-Demo
自己要用的上这个,找轮子的时候正巧发现了一个不错的图片压缩轮子鲁班;正巧原repo主用的rxjava,我一直没有时间点亮这个技能树,所以把rxjava部分扣掉了;正巧大部分的朋友圈轮子都是讨论的显示列表和多图选择器,而没有一个不错的编辑页(包括图片列表UI和图片上传功能),所以把自己的代码整理了下,开了个轮子方便大家借鉴。
Intro
这是一个完整的类似朋友圈的图片选择、压缩、上传的demo,改改就能拿来用。仿朋友圈按顺序上传图片至七牛,基于luban算法压缩修改了luban项目,扣掉rxjava部分,采用线程池,在销毁时用shutDownNow()即可。
QiniuUtils和ImageCompressUtils分别是上传至七牛和鲁班压缩的工具类,注释和todo在代码中给的非常详尽,就不再讨论了。这里主要来聊聊图片上传的顺序与用户选择的顺序一致的问题,这是比较麻烦的一个地方。(代码格式化好麻烦,请配合ide阅读)
private void post() { //线程不安全,判断是否压缩完毕;原始图片地址-压缩后文件 final Map<String, File> compressedFiles = new HashMap<>(); //线程不安全,判断是否上传完毕;压缩后文件-上传KEY final Map<File, String> uploadedKeys = new HashMap<>(); 。。。。。 for (final String imgPath : mImagePathes) { //按照原始图片顺序排序 File temp = compressedFiles.get(imgPath); img_urls += uploadedKeys.get(temp) + ","; }
要正确排序的关键点是用了2个线程不安全的Map来判断和保存操作结果。compressedFiles保存的“原始图片地址-压缩后文件”键值对,uploadedKeys保存的“压缩后文件-上传KEY”键值对。当压缩、上传的过程结束后,编译原始的图片地址(这个顺序是正确的),从compressedFiles中获得压缩后文件的File,然后据此File从uploadedKeys中获取七牛返回的key(我上传服务器是用逗号隔开一次性把所有图片地址key都post到服务器)。
TODO
要完整使用请修改自己的七牛token获取逻辑,请项目内搜索TODO修改。
技能/轮子树
https://github.com/Curzibn/Luban 图片压缩
https://github.com/lovetuzitong/MultiImageSelector 多图选择
https://github.com/huijimuhe/monolog-android 网络模块与自定义Recyclerview
https://github.com/litesuits/android-common 线程池与其他utils