国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統 > Android > 正文

android遞歸壓縮上傳多張圖片到七牛的實例代碼

2019-10-22 18:30:25
字體:
來源:轉載
供稿:網友

最近遇到這樣一個需求:要做一個仿微信朋友圈的功能,要求上傳最多九張圖到七牛。七牛有上傳圖片的接口,但是每次只能上傳一張。如果是九張圖片一齊上傳,使用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<String>類型的圖片路徑   *        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 < 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 {          //結束遞歸            if (loadingDialog != null) {              loadingDialog.dismiss();            }            Contants.upPicStatus = 200;            WorkManger.getInstance().publishWOrk("1", mClassTimetablesId,                tvTitle.getText().toString(), etName.getText().toString(), picUrls, mCourseId);          }          picNum++;//添加計數器,這個要放到最后,不然會數組角標溢出        });  }

這個代碼不難看懂,具體的都寫在注釋里面了,有一些是項目里面用到的,各位看官只要明確在哪里調用方法進行遞歸和在哪里添加計數器,在哪里結束遞歸就可以了。

但是這個方法有一點小瑕疵,正常我們在上傳圖片的過程中,都要有加載進度條,我發現加載進度條在每次上傳成功的時候都會稍微卡一下。初步推斷是因為壓縮圖片引起的,壓縮圖片的時候也是比較耗能的,而且同在主線程,會引起卡頓。提出的解決方案是:把圖片壓縮部分提出來,放在子線程中,先壓縮圖片,然后在同意上傳。不過還沒來的及優化,當然各位如果有什么好的想法,請提出來。感激不盡。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持VEVB武林網。


注:相關教程知識閱讀請移步到Android開發頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 瓮安县| 仲巴县| 乌拉特中旗| 英山县| 开远市| 沂水县| 富阳市| 波密县| 永昌县| 绥化市| 汕尾市| 桃江县| 洪洞县| 乌什县| 望奎县| 桦川县| 香格里拉县| 新河县| 南澳县| 景宁| 忻城县| 大安市| 崇仁县| 古田县| 西峡县| 大英县| 疏勒县| 德清县| 恩平市| 安达市| 磐安县| 巢湖市| 威信县| 开阳县| 陈巴尔虎旗| 福鼎市| 浠水县| 家居| 安福县| 石楼县| 高唐县|