您好,登錄后才能下訂單哦!
最近遇到這樣一個需求:要做一個仿微信朋友圈的功能,要求上傳最多九張圖到七牛。七牛有上傳圖片的接口,但是每次只能上傳一張。如果是九張圖片一齊上傳,使用for循環(huán)的話肯定不行的,很容易出錯。因為上傳七牛的動作是在子線程完成的,for循環(huán)是在主線程的,這就相當于同時開啟十個子線程來上傳圖片,而且都是耗時線程,很容易會ANR的。
最好的解決辦法應(yīng)該是先壓縮圖片,在200k-300k之間,保證圖片不失真,然后一張一張上傳,通過七牛的回調(diào),來判斷上一張圖片是否上傳完成,上傳完成了,再上傳下一張圖片。
好了,話不多說,貼代碼:
1.壓縮圖片
/** * 質(zhì)量壓縮法 * * @param image * @return */ public byte[] compressImage(Bitmap image) { ByteArrayOutputStream baos = new ByteArrayOutputStream(); image.compress(Bitmap.CompressFormat.JPEG, 100, baos);//質(zhì)量壓縮方法,這里100表示不壓縮,把壓縮后的數(shù)據(jù)存放到baos中 int options = 100; while (baos.toByteArray().length / 1024 > 250) { //循環(huán)判斷如果壓縮后圖片是否大于100kb,大于繼續(xù)壓縮 baos.reset();//重置baos即清空baos image.compress(Bitmap.CompressFormat.JPEG, options, baos);//這里壓縮options%,把壓縮后的數(shù)據(jù)存放到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的,這個沒有按比例壓縮,有的圖片尺寸比較大的會模糊,所以現(xiàn)在調(diào)整到250k,估計壓縮的圖片大小會在200-300k左右吧。
2.遞歸上傳圖片
/** * 遞歸上傳圖片主要方法 * @param picUrl 圖片的本地路徑 * @param picSize 上傳圖片總數(shù)量 * //picNum是計數(shù)器,用于計算已上傳圖片的數(shù)目 * //snplMomentAddPhotos.getData().get(picNum)是選擇圖片的開源庫,返回一個ArrayList<String>類型的圖片路徑 * BitmapUnit.getInstance().compressImage(BitmapUnit.getInstance().getBItmap(picUrl))//壓縮圖片 * */ private void upPic(String picUrl, int picSize) { //根據(jù)七牛上傳圖片的api,封裝的上傳方法 QiniuUtils.getInstance().uploadSmallFile(BitmapUnit.getInstance(). compressImage(BitmapUnit.getInstance().getBItmap(picUrl)), url -> { //圖片成功上傳到七牛時回調(diào) //當前完成上傳的圖片數(shù)量小于總圖片數(shù)量的時候重新調(diào)用該方法遞歸 if (picNum < picSize) { upPic(snplMomentAddPhotos.getData().get(picNum), picSize); Contants.upPicStatus = 1; if (loadingDialog != null) { loadingDialog.loadingStatus((picNum + 1) + "/" + picSize + "張圖片"); } //拼接字符串 if (TextUtils.isEmpty(picUrls)) { picUrls = url; } else { picUrls = picUrls + "," + url; } }else { //結(jié)束遞歸 if (loadingDialog != null) { loadingDialog.dismiss(); } Contants.upPicStatus = 200; WorkManger.getInstance().publishWOrk("1", mClassTimetablesId, tvTitle.getText().toString(), etName.getText().toString(), picUrls, mCourseId); } picNum++;//添加計數(shù)器,這個要放到最后,不然會數(shù)組角標溢出 }); }
這個代碼不難看懂,具體的都寫在注釋里面了,有一些是項目里面用到的,各位看官只要明確在哪里調(diào)用方法進行遞歸和在哪里添加計數(shù)器,在哪里結(jié)束遞歸就可以了。
但是這個方法有一點小瑕疵,正常我們在上傳圖片的過程中,都要有加載進度條,我發(fā)現(xiàn)加載進度條在每次上傳成功的時候都會稍微卡一下。初步推斷是因為壓縮圖片引起的,壓縮圖片的時候也是比較耗能的,而且同在主線程,會引起卡頓。提出的解決方案是:把圖片壓縮部分提出來,放在子線程中,先壓縮圖片,然后在同意上傳。不過還沒來的及優(yōu)化,當然各位如果有什么好的想法,請?zhí)岢鰜?。感激不盡。
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持億速云。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。