<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ThinkChat2.0新版上線,更智能更精彩,支持會話、畫圖、視頻、閱讀、搜索等,送10W Token,即刻開啟你的AI之旅 廣告
                ***** **圖片異步加載概述** [TOC=6] # 1. 什么是圖片的異步加載? 異步,在安卓開發中大家熟悉嗎? 熟悉。 說到異步大家能想到什么呢? 多線程開發,Thread、Handler、AsyncTask。 我們在哪里使用異步呢? 網絡請求數據。 圖片的異步加載就是在子線線程中獲取圖片然后在主線程中更新到界面上的操作。 今天我們做一個需求:加載URL中的圖片,顯示到ImageView上。 # 2. 為什么要進行圖片的二次采樣? ![](https://box.kancloud.cn/a65bc06ea363c75904e84c207f733bab_240x427.jpg) 在Android應用里,最耗費內存的就是圖片資源。并且在Android系統中。讀取位圖Bitmap時,分給虛擬機中的圖片的堆棧大小僅僅有8M。假設超出了。就會出現OutOfMemory異常 ~~~ E/AndroidRuntime(? 697): java.lang.OutOfMemoryError E/AndroidRuntime(? 697): ?? ?at android.graphics.BitmapFactory.nativeDecodeAsset(Native Method) E/AndroidRuntime(? 697): ?? ?at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:500) E/AndroidRuntime(? 697): ?? ?at android.graphics.BitmapFactory.decodeResourceStream(BitmapFactory.java:353) E/AndroidRuntime(? 697): ?? ?at android.graphics.BitmapFactory.decodeResource(BitmapFactory.java:376) E/AndroidRuntime(? 697): ?? ?at android.graphics.BitmapFactory.decodeResource(BitmapFactory.java:406) E/AndroidRuntime(? 697): ?? ?at com.example.imagetoshow2.ImageAdapter.createReflectedImages(ImageAdapter.java:66) E/AndroidRuntime(? 697): ?? ?at com.example.imagetoshow2.ImageAdapter.getView(ImageAdapter.java:54) E/AndroidRuntime(? 697): ?? ?at android.widget.AbsSpinner.onMeasure(AbsSpinner.java:193) ~~~ # 3. 了解一下關于Bitmap的Config ARGB: A:透明度 R:紅色 G:綠 B:藍 ~~~ public enum Config { ALPHA_8 (1), RGB_565 (3), @Deprecated ARGB_4444 (4), ARGB_8888 (5); } ~~~ Bitmap.Config ARGB\_4444:每個像素占用2byte內存 ,即A=4,R=4,G=4,B=4,那么一個像素點占4+4+4+4=16位 Bitmap.Config ARGB\_8888:每個像素占用4byte內存 ,即A=8,R=8,G=8,B=8,那么一個像素點占8+8+8+8=32位 Bitmap.Config RGB\_565:每個像素占用2byte內存,即R=5,G=6,B=5,沒有透明度,那么一個像素點占5+6+5=16位 Bitmap.Config ALPHA\_8:每個像素占用1byte內存,只有透明度,沒有顏色。 ? ![](https://box.kancloud.cn/9a92c75f0d552dd04656ca0fadb99b28_1174x1566.png) ![](https://box.kancloud.cn/be9064158032910b55ee4fa26ba978ed_1024x1365.jpg) ? # 4. 內存計算 1TB=1024GB 1GB=1024MB 1MB=1024KB 1KB=1024B 1B=8b 一張 1024 \* 1024 像素,采用ARGB8888格式,一個像素32位,每個像素就是4字節,占有內存就是4M若采用RGB565,一個像素16位,每個像素就是2字節,占有內存就是2M。 Glide加載圖片默認格式RGB565,Picasso為ARGB8888,默認情況下,Glide占用內存會比Picasso低,色彩不如Picasso鮮艷,自然清晰度就低。 通常我們優化Bitmap時,當需要做性能優化或者防止OOM(Out Of Memory),我們通常會使用Bitmap.Config.RGB\_565這個配置,因為Bitmap.Config.ALPHA\_8只有透明度,顯示一般圖片沒有意義,Bitmap.Config.ARGB\_4444顯示圖片不清楚,Bitmap.Config.ARGB\_8888占用內存最多。 圖片加載 如果我們想要加載一張大圖到內存中,如果不進行壓縮的話,那么很顯然就會出現OOM的崩潰, # 5. 二次采樣原理分析 如何將一張大圖壓縮到100kb以下并且保持不失真的特性?這就需要用到下面這個類了**BitmapFactory.Options** BitmapFactory.Options縮放圖片主要用到inSample采樣率, inSample = 1,采樣后圖片的寬高為原始寬高 inSample > 1,例如2,**寬高均為原圖的寬高的1/2** 一個采用ARGB8888的1024 \*1024 的圖片 inSample = 1,占用內存就 1024 \*1024 \*4 = 4M inSample = 2,占用內存就 512 \*512 \* 4 = 1M BitmapFactory 給我們提供了一個解析圖片大小的參數類 BitmapFactory.Options ,把這個類的對象的 inJustDecodeBounds 參數設置為 true,這樣解析出來的 Bitmap 雖然是個 null,但是 options 中可以得到圖片的寬和高以及圖片的類型。得到了圖片實際的寬和高之后我們就可以進行壓縮設置了,主要是計算圖片的采樣率。 ` ~~~ public class BitmapUtils { /** * @param filePath 要加載的圖片路徑 * @param destWidth 顯示圖片的控件寬度 * @param destHeight 顯示圖片的控件的高度 * @return */ public static Bitmap getBitmap(String filePath, int destWidth, int destHeight) { //第一次采樣 BitmapFactory.Options options = new BitmapFactory.Options(); //該屬性設置為true只會加載圖片的邊框進來,并不會加載圖片具體的像素點 options.inJustDecodeBounds = true; //第一次加載圖片,這時只會加載圖片的邊框進來,并不會加載圖片中的像素點 BitmapFactory.decodeFile(filePath, options); //獲得原圖的寬和高 int outWidth = options.outWidth; int outHeight = options.outHeight; //定義縮放比例 int sampleSize = 1; while (outHeight / sampleSize > destHeight || outWidth / sampleSize > destWidth) { //如果寬高的任意一方的縮放比例沒有達到要求,都繼續增大縮放比例 //sampleSize應該為2的n次冪,如果給sampleSize設置的數字不是2的n次冪,那么系統會就近取值 sampleSize *= 2; } /********************************************************************************************/ //至此,第一次采樣已經結束,我們已經成功的計算出了sampleSize的大小 /********************************************************************************************/ //二次采樣開始 //二次采樣時我需要將圖片加載出來顯示,不能只加載圖片的框架,因此inJustDecodeBounds屬性要設置為false options.inJustDecodeBounds = false; //設置縮放比例 options.inSampleSize = sampleSize; options.inPreferredConfig = Bitmap.Config.ARGB_8888; //加載圖片并返回 return BitmapFactory.decodeFile(filePath, options); } } ~~~ ` ![](https://box.kancloud.cn/3776ee2322c00dd39b896440206185a8_700x466.jpg) 跟上 學會了嗎?
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看