美文网首页
Glide入门

Glide入门

作者: 有点健忘 | 来源:发表于2018-04-09 11:38 被阅读63次

git地址https://github.com/bumptech/glide
相关地址
https://www.jianshu.com/p/2942a57401eb#comment-22582650
https://blog.csdn.net/column/details/15318.html
https://blog.csdn.net/hexingen/article/details/72970807
https://blog.csdn.net/hexingen/article/details/76422241

使用,app下的build.gradle里添加库

    implementation 'com.github.bumptech.glide:glide:4.6.1'
    annotationProcessor 'com.github.bumptech.glide:compiler:4.6.1'

另外添加一个internet权限,就可以用拉
GlideApp.with(this).load("http://goo.gl/gEgYUd").into(imageView);
最简单的就是上边的用法了。with后边可以是fragment,activity,view,context之类的。

不过如果你是用kotlin写的,运行的时候会失败的,如下GildeApp不识别
Unresolved reference: GlideApp

但是你用下边的写法,在kotlin中是没问题的
Glide.with(iv).load(url) .into(iv)

如果你想对glide的一些默认配置做整体修改咋办,增加如下的类。这个类的配置可以参考上边的文章
注意以下,用java写,别用kotlin,要不GlideApp可能不识别

import android.content.Context;
import android.os.Environment;
import android.support.annotation.NonNull;
import com.bumptech.glide.Glide;
import com.bumptech.glide.GlideBuilder;
import com.bumptech.glide.Registry;
import com.bumptech.glide.annotation.GlideModule;
import com.bumptech.glide.load.engine.bitmap_recycle.LruBitmapPool;
import com.bumptech.glide.load.engine.cache.DiskLruCacheFactory;
import com.bumptech.glide.load.engine.cache.ExternalCacheDiskCacheFactory;
import com.bumptech.glide.load.engine.cache.LruResourceCache;
import com.bumptech.glide.load.model.GlideUrl;
import com.bumptech.glide.module.AppGlideModule;

import java.io.File;
import java.io.InputStream;

/**
 * Created by charlie.song on 2018/4/8.
 * 加上@GlideModule注解以便Glide识别
 */
@GlideModule
public class MyGlideConfig extends AppGlideModule {
    int diskCacheSize=500*1024*1024;
    private File diskCacheFolder=new File(Environment.getExternalStorageDirectory(),"demo0327");
    @Override
    public void applyOptions(@NonNull Context context, @NonNull GlideBuilder builder) {
        //磁盘缓存配置(默认缓存大小250M,默认保存在内部存储中)
        //设置磁盘缓存保存在外部存储,且指定缓存大小
//        builder.setDiskCache(new ExternalCacheDiskCacheFactory(context, diskCacheSize));
        //设置磁盘缓存保存在自己指定的目录下,且指定缓存大小
        builder.setDiskCache(new DiskLruCacheFactory(new DiskLruCacheFactory.CacheDirectoryGetter() {
            @Override
            public File getCacheDirectory() {
                return diskCacheFolder;
            }
        }, diskCacheSize));
        System.out.println("=====================apply options");
        //内存缓存配置(不建议配置,Glide会自动根据手机配置进行分配)
        //设置内存缓存大小
//        builder.setMemoryCache(new LruResourceCache(memoryCacheSize));
        //设置Bitmap池大小
//        builder.setBitmapPool(new LruBitmapPool(bitmapPoolSize));
    }

    @Override
    public void registerComponents(@NonNull Context context, @NonNull Glide glide, @NonNull Registry registry) {
        super.registerComponents(context, glide, registry);
        //替换组件,如下替换网络请求库
//        registry.replace(GlideUrl.class, InputStream.class, new OkHttpUrlLoader.Factory());
    }
}

以前这个配置文件是在manifest里注册的,现在是通过添加@GlideModule这个注解来注册的,省事
下边继续说碰到的问题。如果直接在kotlin代码里使用GlideApp会出错的。那咋办,如下,写个java文件使用GildeApp,然后kotlin代码里调用这个java代码里的方法就没问题了。

public class UtilNormal {

    public static void loadCircle(Context context,String url, ImageView iv){
        GlideApp.with(context).load(url).circleCrop().placeholder(R.mipmap.ic_launcher).error(R.mipmap.ic_launcher_round).into(iv);
    }
}

另外,比如上边的我们添加了配置文件,我修改了Glide默认缓存的图片路径在sdcard上,读写文件是需要权限的。
来处理下动态权限,如下在activity里添加如下的代码,嗯,放在加载图片之前额,要不的话你这边权限还没申请,那边配置文件已经执行了。那就得杀死程序下次进来才有效果拉。

    fun requestExternalStorage() {
        if (ContextCompat.checkSelfPermission(this,
                        Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
            ActivityCompat.requestPermissions(this,
                    arrayOf(Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.READ_EXTERNAL_STORAGE), 1)
        }
    }

    override fun onRequestPermissionsResult(requestCode: Int, permissions: Array<String>, grantResults: IntArray) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults)
        if (requestCode == 1) {
            for (i in permissions.indices) {
                if (grantResults[i] == PERMISSION_GRANTED) {
                    Toast.makeText(this, "" + "权限" + permissions[i] + "申请成功", Toast.LENGTH_SHORT).show()
                } else {
                    Toast.makeText(this, "" + "权限" + permissions[i] + "申请失败", Toast.LENGTH_SHORT).show()
                }
            }
        }
    }

最新的解决办法,kotlin中使用GlideApp的办法
在app的build.gradle下添加下边 的代码就可以了,不需要在写java文件了。

apply plugin: 'kotlin-kapt'//kapt3插件

    implementation 'com.github.bumptech.glide:glide:4.6.1'
    kapt 'com.github.bumptech.glide:compiler:4.6.1' //annotationProcessor 改成kapt,别忘了上边那个kotlin-kapt插件。

动态权限平时都不用,都是偷懒把targetSDK改成21。待会去看下动态权限,记得有不少封装好的库

后记

今天无聊把文件移动了下位置,发现这玩意又挂了,一直提示GlideApp找不到。坑爹。我以为是我新加的库冲突了,删了还是不行,后来点到我使用这个东西的地方,看到灰色的代码
import com.charliesong.demo0327.GlideApp;
为啥根目录下应该有个这个?奇怪,我想了想我都干啥了,我就是把根目录下的一堆文件都拉到一个新的文件夹下了。。
想了想,我就把和glide相关的文件拉出来继续放到根目录下,结果没事了。

@GlideModule
public class MyGlideConfig extends AppGlideModule {

上边说了一堆都是假象,真正的原因在下边


image.png

先说下GlideApp使用的条件,参考上边的代码

随便自定义一个类extends AppGlideModule
为这个类加入注解@GlideModule
然后需要点击studio上方的工具栏Build,然后选择第一个Make Project【这个是重点,如果你以后移动了这个文件的位置,那么就得删除上边的import的东西,然后重新点击Make Project生成GlideApp

分析原因

就因为生成的GlideApp的位置和继承AppGlideModule这玩意的子类是同一package,所以你如果移动了这个继承AppGlideModule的子类,那么老的GlideApp的位置就不对了,就得重新make生成了。

相关文章

网友评论

      本文标题:Glide入门

      本文链接:https://www.haomeiwen.com/subject/cavbhftx.html