本身要用的上這個,找輪子的時候正巧發現了一個不錯的圖片壓縮輪子魯班;正巧原repo主用的rxjava,我一直沒有時間點亮這個技能樹,因此把rxjava部分扣掉了;正巧大部分的朋友圈輪子都是討論的顯示列表和多圖選擇器,而沒有一個不錯的編輯頁(包括圖片列表UI和圖片上傳功能),因此把本身的代碼整理了下,開了個輪子方便你們借鑑。java
這是一個完整的相似朋友圈的圖片選擇、壓縮、上傳的demo,改改就能拿來用。仿朋友圈按順序上傳圖片至七牛,基於luban算法壓縮修改了luban項目,扣掉rxjava部分,採用線程池,在銷燬時用shutDownNow()便可。android
QiniuUtils和ImageCompressUtils分別是上傳至七牛和魯班壓縮的工具類,註釋和todo在代碼中給的很是詳盡,就再也不討論了。這裏主要來聊聊圖片上傳的順序與用戶選擇的順序一致的問題,這是比較麻煩的一個地方。(代碼格式化好麻煩,請配合ide閱讀)git
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到服務器)。github
要完整使用請修改本身的七牛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 線程池與其餘utilside