最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

 更新時間:2017年08月09日 08:22:52   作者:小火火520  
本篇文章主要介紹了android遞歸壓縮上傳多張圖片到七牛的實例代碼,具有一定的參考價值,感興趣的小伙伴們可以參考一下

最近遇到這樣一個需求:要做一個仿微信朋友圈的功能,要求上傳最多九張圖到七牛。七牛有上傳圖片的接口,但是每次只能上傳一張。如果是九張圖片一齊上傳,使用for循環(huán)的話肯定不行的,很容易出錯。因為上傳七牛的動作是在子線程完成的,for循環(huán)是在主線程的,這就相當于同時開啟十個子線程來上傳圖片,而且都是耗時線程,很容易會ANR的。

最好的解決辦法應該是先壓縮圖片,在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)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關文章

  • Flutter彈性布局Flex水平排列Row垂直排列Column使用示例

    Flutter彈性布局Flex水平排列Row垂直排列Column使用示例

    這篇文章主要為大家介紹了Flutter彈性布局Flex水平排列Row垂直排列Column使用示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-08-08
  • Android使用Realm數(shù)據(jù)庫實現(xiàn)App中的收藏功能(代碼詳解)

    Android使用Realm數(shù)據(jù)庫實現(xiàn)App中的收藏功能(代碼詳解)

    這篇文章主要介紹了Android使用Realm數(shù)據(jù)庫實現(xiàn)App中的收藏功能,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-03-03
  • Android編程中的消息機制實例詳解

    Android編程中的消息機制實例詳解

    這篇文章主要介紹了Android編程中的消息機制,結(jié)合實例形式較為詳細的分析了Android中消息機制的原理,注意事項與相關使用技巧,需要的朋友可以參考下
    2016-01-01
  • 分享安裝Android Studio3.6的經(jīng)驗教訓

    分享安裝Android Studio3.6的經(jīng)驗教訓

    這篇文章主要介紹了Android Studio3.6的安裝錯誤問題及解決方法,非常值得大家參考,現(xiàn)把整個過程分享到腳本之家平臺,需要的朋友參考下吧
    2020-02-02
  • Android Studio配置本地SDK的方法

    Android Studio配置本地SDK的方法

    這篇文章主要介紹了Android Studio配置本地SDK的方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-11-11
  • android開發(fā)去除標題欄的方法

    android開發(fā)去除標題欄的方法

    這篇文章主要介紹了android開發(fā)去除標題欄的方法,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-04-04
  • Android開發(fā)Input系統(tǒng)觸摸事件分發(fā)

    Android開發(fā)Input系統(tǒng)觸摸事件分發(fā)

    這篇文章主要為大家介紹了Android開發(fā)Input系統(tǒng)觸摸事件分發(fā)示例解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-03-03
  • Android仿小米時鐘效果

    Android仿小米時鐘效果

    這篇文章主要為大家詳細介紹了Android仿小米時鐘效果的相關資料,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-03-03
  • Android手機開發(fā) 控件 TextView文字居中

    Android手機開發(fā) 控件 TextView文字居中

    本文主要介紹Android手機開發(fā)TextView居中的方法,希望能幫到大家。
    2016-05-05
  • Android實現(xiàn)頁面滑動切換動畫

    Android實現(xiàn)頁面滑動切換動畫

    這篇文章主要為大家詳細介紹了Android實現(xiàn)頁面滑動切換動畫,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-12-12

最新評論

施甸县| 灵璧县| 井陉县| 金门县| 大方县| 庄河市| 泰宁县| 岳西县| 梁山县| 来宾市| 库尔勒市| 朝阳市| 鹤峰县| 横峰县| 泗阳县| 石城县| 吉林省| 宁晋县| 景德镇市| 新晃| 三明市| 洛隆县| 类乌齐县| 辽阳县| 万载县| 高青县| 全州县| 资阳市| 清丰县| 无棣县| 沂南县| 建瓯市| 友谊县| 花垣县| 含山县| 宣威市| 调兵山市| 河曲县| 荔波县| 石阡县| 习水县|