从选择到上传,可能是最贴心的高仿朋友圈编辑了

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

Github地址

https://github.com/huijimuhe/Luban-Circle-Demo

posted @ 2016-08-05 17:38  保安保安  阅读(833)  评论(3编辑  收藏  举报