Skip to content

云课堂Glide 4.x 与 应用Glide 3.x 版本冲突解决方案

SHLURENJIA edited this page Jun 24, 2020 · 1 revision

云课堂模块使用的Glide版本为4.x,而有开发者的主工程使用的是Glide 3.x版本。

Glide从3.x升级到4.x之后,因为Glide变更,用法上产生了较大差异差异。而集成云课堂模块后,由于云课堂模块里面使用了4.x版本,as编译时会高版本覆盖低版本,整个应用将会同一使用了Glide4.x的依赖包,导致会出现Glide3.x升级4.x的问题。

解决方案一:升级主工程Glide

推荐此方案。开发者可以直接使用云课堂提供的Glide版本,修改主工程的相关使用。

迁移内容可以参考官方文档:从v3迁移到v4

解决方案二:降低云课堂模块Glide版本

云课堂的Glide图片加载经过二次封装,开发者可以修改com.easefun.polyv.commonui.utils.imageloader下的代码。

由于部分开发者修改主工程代码较多,可以直接修改云课堂模块的imageloader相关源码,将其版本降低为3.x版本。参考步骤如下:

1、修改依赖

打开commonui/build.gradle依赖文件,修改如下代码:

dependencies {
		//...省略部分依赖
    //1、排除glide相关版本
    api ('jp.wasabeef:glide-transformations:3.3.0'){
        exclude group:'com.github.bumptech.glide',module:'glide'
    }
    //2、修改依赖版本
    api ("com.github.bumptech.glide:okhttp3-integration:1.5.0@aar"){
        exclude group:'com.github.bumptech.glide',module:'glide'
    }
    //3、注释取消引用,4.x版本开始支持
//    annotationProcessor 'com.github.bumptech.glide:compiler:4.7.1'
    //4、添加3.x的Glide依赖
    implementation 'com.github.bumptech.glide:glide:3.7.0'
}

2、替换以下类文件内容

  • GlideImageLoadEngine.java
package com.easefun.polyv.commonui.utils.imageloader.glide;

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
import android.support.annotation.DrawableRes;
import android.support.annotation.WorkerThread;
import android.widget.ImageView;
import com.bumptech.glide.Glide;
import com.bumptech.glide.load.engine.DiskCacheStrategy;
import com.bumptech.glide.load.resource.drawable.GlideDrawable;
import com.bumptech.glide.load.resource.gif.GifDrawable;
import com.bumptech.glide.request.RequestListener;
import com.bumptech.glide.request.animation.GlideAnimation;
import com.bumptech.glide.request.target.SimpleTarget;
import com.bumptech.glide.request.target.Target;
import com.easefun.polyv.commonui.utils.imageloader.IImageLoadEngine;
import com.easefun.polyv.commonui.utils.imageloader.IPolyvProgressListener;
import com.easefun.polyv.commonui.utils.imageloader.glide.progress.PolyvMyProgressManager;
import com.easefun.polyv.commonui.utils.imageloader.glide.progress.PolyvOnProgressListener;
import java.io.File;
import java.util.concurrent.ExecutionException;

public class GlideImageLoadEngine implements IImageLoadEngine {


    @Override
    public void loadImage(Context context, String url, ImageView imageView) {
        Glide.with(context)
                .load(url)
                .into(imageView);
    }

    @Override
    @WorkerThread
    public File saveImageAsFile(Context context, String url) throws ExecutionException, InterruptedException {
        return Glide.with(context)
                .load(url)
                .downloadOnly(Target.SIZE_ORIGINAL, Target.SIZE_ORIGINAL)
                .get();
    }

    @Override
    public void loadImage(Context context, final String url, final int position, @DrawableRes int errorRes, final IPolyvProgressListener listener) {

        PolyvMyProgressManager.removeListener(url, position);
        PolyvMyProgressManager.addListener(url, position, new PolyvOnProgressListener() {
            @Override
            public void onProgress(String url, boolean isComplete, int percentage, long bytesRead, long totalBytes) {
                listener.onProgress(url, isComplete, percentage, bytesRead, totalBytes);
            }


            @Override
            public void onStart(String url) {
                listener.onStart(url);
            }
        });
        Glide.with(context)
                .load(url)
                .error(errorRes)
                .listener(new RequestListener<String, GlideDrawable>() {
                    @Override
                    public boolean onException(Exception e, String model, Target<GlideDrawable> target, boolean isFirstResource) {
                        listener.onFailed(e, model);
                        return false;
                    }

                    @Override
                    public boolean onResourceReady(GlideDrawable resource, String model, Target<GlideDrawable> target, boolean isFromMemoryCache, boolean isFirstResource) {
                        PolyvMyProgressManager.removeListener(url, position);
                        listener.onProgress(url, true, 100, 0, 0);
                        return false;
                    }
                })
                .bitmapTransform(new CompressTransformation(context, url))
                .into(new SimpleTarget<GlideDrawable>() {
                    @Override
                    public void onResourceReady(GlideDrawable resource, GlideAnimation<? super GlideDrawable> glideAnimation) {
                        listener.onResourceReady(resource);
                        if (resource instanceof GifDrawable) {
                            resource.start();//显示gif
                        }
                    }

                    @Override
                    public void onDestroy() {
                        PolyvMyProgressManager.removeListener(url, position);
                    }
                });
    }


    @Override
    public void loadImageNoDiskCache(Context context, String url, @DrawableRes int placeHolder, @DrawableRes int error, ImageView imageView) {
        Glide.with(context)
                .load(url)
                .placeholder(placeHolder)
                .error(error)
                .diskCacheStrategy(DiskCacheStrategy.NONE)
                .into(imageView);
    }

    @Override
    public Drawable getImageAsDrawable(Context context, String url) {
        try {
            Bitmap bitmap = Glide.with(context)
                    .load(url)
                    .asBitmap() //必须
                    .into(Target.SIZE_ORIGINAL, Target.SIZE_ORIGINAL)
                    .get();
            return new BitmapDrawable(bitmap);
        } catch (InterruptedException e) {
            e.printStackTrace();
        } catch (ExecutionException e) {
            e.printStackTrace();
        }
        return null;
    }
}
  • CompressTransformation.java
package com.easefun.polyv.commonui.utils.imageloader.glide;

import android.content.Context;
import android.graphics.Bitmap;
import com.bumptech.glide.Glide;
import com.bumptech.glide.load.Transformation;
import com.bumptech.glide.load.engine.Resource;
import com.bumptech.glide.load.engine.bitmap_recycle.BitmapPool;
import com.bumptech.glide.load.resource.bitmap.BitmapResource;
import com.easefun.polyv.cloudclass.chat.send.img.PolyvSendChatImageHelper;

import java.io.File;
import java.security.MessageDigest;

/**
 * 压缩
 */
public class CompressTransformation implements Transformation<Bitmap> {

    private static final int VERSION = 1;
    private static final String ID = "CompressTransformation." + VERSION;

    private BitmapPool mBitmapPool;
    private String mUrl;

    CompressTransformation(Context context, String url) {
        this(url, Glide.get(context).getBitmapPool());
    }

    private CompressTransformation(String url, BitmapPool pool) {
        mBitmapPool = pool;
        mUrl = url;
    }



    @Override
    public boolean equals(Object obj) {
        return obj instanceof CompressTransformation;
    }

    @Override
    public int hashCode() {
        return ID.hashCode();
    }


    @Override
    public Resource<Bitmap> transform(Resource<Bitmap> resource, int outWidth, int outHeight) {
        if (new File(mUrl).isFile()) {
            try {
                Bitmap bitmap = PolyvSendChatImageHelper.compressImage(mUrl);
                if (bitmap != null) {
                    return BitmapResource.obtain(bitmap, mBitmapPool);
                }
            } catch (Exception e) {
            }
        }
        return resource;
    }

    @Override
    public String getId() {
        return ID;
    }
}
  • PolyvProgressLibraryGlideModule.java

注释整个类文件或者移除

3、移除无关引用import