記glide框架使用中所遇到的問題


最近實在是太忙,每有時間寫博客。記得之前寫過一篇關於glide加載圖片不顯示的博客,但是給出最終的解決方法。這次我將把在項目中使用glide所遇到的問題總結一下。

1.使用glide最好對glide進行全局的配置,此時需要寫一個繼承GlideModule的GlideModelConfig類

public class GlideModelConfig implements GlideModule{
    int diskSize = 1024 * 1024 * 100;
    int memorySize = (int) (Runtime.getRuntime().maxMemory()) / 8;  // 取1/8最大內存作為最大緩存
    @Override
    public void applyOptions(Context context, GlideBuilder builder) {
        // 默認內存和圖片池大小
        MemorySizeCalculator calculator = new MemorySizeCalculator(context);
        int defaultMemoryCacheSize = calculator.getMemoryCacheSize(); // 默認內存大小
        int defaultBitmapPoolSize = calculator.getBitmapPoolSize(); // 默認圖片池大小
        builder.setMemoryCache(new LruResourceCache(defaultMemoryCacheSize)); // 該兩句無需設置,是默認的
        builder.setBitmapPool(new LruBitmapPool(defaultBitmapPoolSize));
        //定義圖片的本地磁盤緩存
        File cacheDir = context.getExternalCacheDir();//指定的是數據的緩存地址
        int diskCacheSize = 1024 * 1024 * 30;//最多可以緩存多少字節的數據
        //設置磁盤緩存大小
        builder.setDiskCache(new DiskLruCacheFactory(cacheDir.getPath(), "glide", diskCacheSize));
        // 定義緩存大小和位置
        builder.setDiskCache(new InternalCacheDiskCacheFactory(context, diskSize));  //內存中
        builder.setDiskCache(new ExternalCacheDiskCacheFactory(context, "cache", diskSize)); //sd卡中
        // 定義圖片格式
        builder.setDecodeFormat(DecodeFormat.PREFER_RGB_565); // 默認
        // 自定義內存和圖片池大小
        builder.setMemoryCache(new LruResourceCache(memorySize));
        builder.setBitmapPool(new LruBitmapPool(memorySize));
        //builder.setDecodeFormat(DecodeFormat.PREFER_ARGB_8888);
    }

    @Override
    public void registerComponents(Context context, Glide glide) {

    }
}

還得再在清單文件中,對該類進行配置

<meta-data
            android:name="com.***.GlideModelConfig"
            android:value="GlideModule"/>

2.當你使用的圖片控件為CircleImagview的時候,會出現第一加載圖片失敗,當你再次下拉刷新的時候,才能展現出圖片,此時的解決辦法有以下幾種

  a.使用Imagview,如果你想使imagview變成圓形,有以下兩種常用方法

    1.使用xml的shape(此方法比較簡單)

    2.第二使用glide自帶的圓形轉化類

     代碼如下

private static Bitmap circleCrop(BitmapPool pool, Bitmap source) {
            if (source == null) return null;
            int size = Math.min(source.getWidth(), source.getHeight());
            int x = (source.getWidth() - size) / 2;
            int y = (source.getHeight() - size) / 2;
            // TODO this could be acquired from the pool too
            Bitmap squared = Bitmap.createBitmap(source, x, y, size, size);

            Bitmap result = pool.get(size, size, Bitmap.Config.ARGB_8888);
            if (result == null) {
                result = Bitmap.createBitmap(size, size, Bitmap.Config.ARGB_8888);
            }

            Canvas canvas = new Canvas(result);
            Paint paint = new Paint();
            paint.setShader(new BitmapShader(squared, BitmapShader.TileMode.CLAMP, BitmapShader.TileMode.CLAMP));
            paint.setAntiAlias(true);
            float r = size / 2f;
            canvas.drawCircle(r, r, r, paint);
            return result;
        }

        @Override
        public String getId() {
            return getClass().getName();
        }
    }

再在glide的使用中使用該類

 /**
     * 頭像設置成圓角
     *
     * @param url
     * @param context
     * @param imageView
     */
    public static void downLoadPicCircle1(String url, Context context, ImageView imageView) {
        Glide.with(context)
                .load(url)
                .diskCacheStrategy(DiskCacheStrategy.ALL)
                .placeholder(R.mipmap.touxiang)
                .error(R.mipmap.touxiang)
                .transform(new CircleTransform(context))
                .into(imageView);
    }

這樣iamgview就可以轉化為圓形了。

2.第二個方法就是我上次使用glide所提出的解決方法,不要設置占位 http://www.cnblogs.com/jiutiankunpeng/p/5715201.html

ps:網上還有大神提出了如下代碼的解決方法

Glide.with(mContext)
    .load(url) 
    .placeholder(R.drawable.loading_spinner)
    .into(new SimpleTarget<Bitmap>(width, height) {
        @Override 
        public void onResourceReady(Bitmap bitmap, GlideAnimation anim) {
            // setImageBitmap(bitmap) on CircleImageView 
        } 
    };

3.在使用glide的時,又是程序會莫名其妙的崩潰,studio會提示如下錯誤 You cannot start a load for a destroyed activity

這個問題的解決方法是,將with(context)換成with(getAppliationContext),這樣就不會爆這個錯誤了。

4.在glide中加入try catche(下面的代碼,是使用glide加載本地圖片)

public static void loadImage(@IdRes int resId, ImageView imageView) {
        try {
            Glide.with(imageView.getContext())
                    .load(resId)
                    .dontAnimate()//直接顯示圖片而沒有任何淡入淡出效果
                    .placeholder(R.drawable.default_diagram)
                    .into(imageView);
        } catch (Exception e) {

        }


    }

最后,glide 還有很多其他知識,如內存的緩存策略,圖片裁剪( override),請求圖片的優先級等,一系列問題,這些東西大家都可以使用google找到學習資料,等下次有時間再一一介紹。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM