Android Glide应用中遇到问题

1. 导入库

build.gradle中添加glide库,kotlin用kapt,java用annotationProcessor

dependencies {
    implementation 'com.github.bumptech.glide:glide:4.13.2'
    kapt 'com.github.bumptech.glide:compiler:4.13.2'
    annotationProcessor 'com.github.bumptech.glide:compiler:4.13.2'
}

ProjectGlideModule继承AppGlideModule,需要添加GlideModule注释。applyOptions方法中可以对builder进行全局配置。

@GlideModule
class ProjectGlideModule : AppGlideModule() {

    override fun applyOptions(context: Context, builder: GlideBuilder) {
        super.applyOptions(context, builder)
    }

    override fun registerComponents(context: Context, glide: Glide, registry: Registry) {
        super.registerComponents(context, glide, registry)
    }
    
}

2. OKHttp配置

Glide 默认的请求网络框架是HttpURLConnection,想要改成OkHttp就需要用到registerComponents函数。首先需要导入okhttp3-integration

implementation 'com.github.bumptech.glide:okhttp3-integration:4.13.2'

registerComponents函数内调用Registryreplace方法替代网络请求框架。

override fun registerComponents(context: Context, glide: Glide, registry: Registry) {
    super.registerComponents(context, glide, registry)

    registry.replace(GlideUrl::class.java, InputStream::class.java, OkHttpUrlLoader.Factory(NetworkUtil.getOKHttpClient()))
}

3. 自定义模型

在实际项目中,我们往往会有一些特殊需要。比如我们通过url返回图片的字节流,还需要Base64解码才能使用。

  • 定义GlideDownloadPic类,继承com.bumptech.glide.load.Key,需要实现updateDiskCacheKey函数
    class GlideDownloadPic(val picUrl: String) : Key {
        private var mGlideUrl = GlideUrl(picUrl)
    
        override fun updateDiskCacheKey(messageDigest: MessageDigest) {
            mGlideUrl.updateDiskCacheKey(messageDigest)
        }
    
    }
    
  • 定义GlideDownloadPicModelLoader,继承ModelLoaderFactory继承ModelLoaderFactory,在后面注册时使用。buildLoadData函数用来获取图片数据。
    class GlideDownloadPicModelLoader : ModelLoader<GlideDownloadPic, InputStream> {
    
        class Factory : ModelLoaderFactory<GlideDownloadPic, InputStream> {
    
            override fun build(multiFactory: MultiModelLoaderFactory): ModelLoader<GlideDownloadPic, InputStream> {
                return GlideDownloadPicModelLoader()
            }
    
            override fun teardown() {
            }
    
        }
    
        override fun buildLoadData(
            model: GlideDownloadPic,
            width: Int,
            height: Int,
            options: Options
        ): ModelLoader.LoadData<InputStream>? {
            return ModelLoader.LoadData(model, GlideDownloadPicDataFetcher(model))
        }
    
        override fun handles(model: GlideDownloadPic): Boolean {
            return true
        }
    
    }
    
  • 定义GlideDownloadPicDataFetcher,继承DataFetcher
    class GlideDownloadPicDataFetcher(downloadPic: GlideDownloadPic) : DataFetcher<InputStream> {
    
        private var mDownloadPic = downloadPic
    
        override fun loadData(priority: Priority, callback: DataFetcher.DataCallback<in InputStream>) {
            downloadPic(mDownloadPic.picUrl, {
                callback.onDataReady(ByteArrayInputStream(Base64.decode(it, Base64.DEFAULT)))
            }, {
                callback.onLoadFailed(it)
            })
        }
    
        // 下载图片
        private fun downloadPic(picUrl: String, onSuccess:(ByteArray) -> Unit, onFail:(Exception) -> Unit) {
            if (picUrl.startsWith("http")) {
                NetworkUtil.getOKHttpClient()
                    .newCall(Request.Builder().url(picUrl).build())
                    .enqueue(object : Callback{
                        override fun onResponse(call: Call, response: Response) {
                            if (response.isSuccessful) {
                                var bodyByteArray = response.body()?.bytes()
                                if (bodyByteArray != null) {
                                    onSuccess(bodyByteArray)
                                    return
                                }
                            }
                            onFail(IOException("wrong url $picUrl"))
                        }
    
                        override fun onFailure(call: Call, e: IOException) {
                            onFail(IOException("wrong url $picUrl"))
                        }
                    })
            } else {
                onFail(IOException("wrong url $picUrl"))
            }
        }
    
        override fun getDataClass(): Class<InputStream> {
            return InputStream::class.java
        }
    
        override fun cleanup() {
        }
    
        override fun getDataSource(): DataSource {
            return DataSource.REMOTE
        }
    
        override fun cancel() {
        }
    }
    
  • registerComponents函数内注册
    registry.replace(GlideDownloadPic::class.java, InputStream::class.java,
            GlideDownloadPicModelLoader.Factory())
    
  • 使用自定义模型
    Glide.with(this).load(GlideDownloadPic("xxx.jpg"))
            .error(getDrawable(R.drawable.xxx))
            .into(findViewById(R.id.image_view))
    
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Android面试问题可以包括以下几个方面: 1. Android基础知识:这包括对Android操作系统的理解,四大组件(活动、服务、内容提供者、广播接收器)的使用和生命周期等等。 2. Java编程:Android开发主要使用Java语言,因此对Java语法、OOP(面向对象编程)的理解和Java常用类的使用都是必备的。 3. 布局和界面:Android应用开发离不开界面的设计和布局,对常用布局(如线性布局、相对布局、帧布局)和控件的使用熟练掌握是重要的。 4. 数据存储和管理:了解Android数据的存储方式,如使用SQLite数据库、SharedPreferences等进行本地数据存储,也要了解网络数据的请求和处理。 5. 多线程和异步编程:对于Android应用来说,处理耗时任务需使用多线程或异步编程方式,了解如何使用AsyncTask、Handler等组件来实现多线程操作是必要的。 6. 性能优化和内存管理:在开发Android应用时,需要对应用的性能进行优化,理解内存泄漏的原因,掌握使用Android Profiler等工具进行性能分析和调优。 7. 第三方库和框架:熟悉常用的Android第三方库和框架(如Retrofit、Glide、ButterKnife),了解它们的用途和基本使用方法。 8. 安全性:了解Android应用开发的安全性问题,如如何保护用户数据、防止恶意攻击等。 9. 版本控制工具:熟悉使用Git等版本控制工具进行代码管理和团队协作。 10. 实际项目经验:面试官可能会问到你在之前的实际项目遇到问题和解决方案,以及你的贡献和角色等。 回答这些问题时,建议结合自己的实际经验和项目经历进行回答,展示自己的能力和对Android开发的理解。 ### 回答2: 在Google的Android面试,可能会遇到以下问题: 1. 请介绍一下Android平台的架构。 Android平台的架构由Linux内核、硬件驱动、运行时库、应用框架和应用组成。Linux内核是底层硬件控制的核心,硬件驱动提供了与硬件交互的接口,运行时库包括了核心库和C/C++库,应用框架提供了开发应用程序的API接口,应用则是用户使用的应用程序。 2. 请介绍一下Android的四大组件。 Android的四大组件包括Activity、Service、Broadcast Receiver和Content Provider。Activity负责提供用户界面,Service负责后台执行长时间运行的任务,Broadcast Receiver负责接收和处理系统广播消息,Content Provider负责数据共享和存取。 3. 请介绍一下Activity的生命周期。 Activity的生命周期包括onCreate、onStart、onResume、onPause、onStop、onDestroy等方法。当Activity被创建时会调用onCreate方法,当其可见但还无法与用户交互时会调用onStart和onResume方法,当其失去焦点但未被销毁时会调用onPause方法,当其完全不可见时会调用onStop方法,当Activity被销毁时会调用onDestroy方法。 4. 请介绍一下Android的布局文件和代码文件。 Android的布局文件使用XML语言编写,用于定义应用界面的组件和布局方式。代码文件用于处理布局文件的组件的行为,包括点击事件、数据绑定等逻辑。 5. 请介绍一下Android的Intent。 Intent是Android用于传递消息和执行动作的对象。它可以用于启动Activity、Service和Broadcast Receiver,也可以用于发送和接收数据。通过Intent,可以在不同的组件之间传递数据和通信。 总结: Android面试,会涉及到Android平台的架构、四大组件、Activity的生命周期、布局文件和代码文件的概念以及Intent的使用。准备这些内容,能够更好地回答面试官的问题,展示自己的Android开发能力。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值