Android Coil 3 extend ImageRequest‘s custom method/function,Kotlin

Android Coil 3 extend ImageRequest's custom method/function,Kotlin

为Android Coil3图像加载库扩展自定义超时功能。通过创建MyCoilMgr类,使用companion object定义timeout扩展函数和属性,并实现TimeoutInterceptor拦截器来监控请求耗时。拦截器使用withTimeoutOrNull协程函数处理超时逻辑,记录请求耗时或超时情况。最后展示了使用方式:通过ImageRequest.Builder.timeout()设置超时时间,并用MyCoilMgr实例执行请求。该方案为Coil3提供了灵活的超时控制能力。

Kotlin 复制代码
class MyCoilMgr {
    companion object {
     
        private val timeoutKey = Extras.Key(default = Long.MAX_VALUE)

        fun ImageRequest.Builder.timeout(timeout: Long) = apply {
            extras[timeoutKey] = timeout
        }

        val ImageRequest.timeout: Long
            get() = getExtra(timeoutKey)


        ...
    }

    
    fun init(ctx: Context): ImageLoader {

        //初始化加载器。
        mImageLoader = ImageLoader.Builder(ctx)
            ...
            .components {
                add(TimeoutInterceptor())
            }.build()

        return mImageLoader
    }
}
Kotlin 复制代码
import android.util.Log
import coil3.intercept.Interceptor
import coil3.request.ImageResult
import com.ppdemo.coil.MyCoilMgr.Companion.timeout
import kotlinx.coroutines.withTimeoutOrNull

class TimeoutInterceptor : Interceptor {
    companion object {
        const val TAG = "fly/TimeoutInterceptor"
    }

    var startTime = 0L
    var timeCost = 0L
    lateinit var result: ImageResult

    override suspend fun intercept(chain: Interceptor.Chain): ImageResult {
        val timeout = chain.request.timeout

        val exe = withTimeoutOrNull(timeout, {
            startTime = System.currentTimeMillis()
            result = chain.proceed()
            timeCost = System.currentTimeMillis() - startTime
        })

        if (exe == null) {
            Log.e(TAG, "timeout! $timeout ms , request=${chain.request.data}")
        } else {
            Log.d(TAG, "time cost = $timeCost ms , request=${chain.request.data}")
        }

        return result
    }
}

so, we can use it in ImageRequest, for example:

Kotlin 复制代码
        val req = ImageRequest.Builder(this)
            ....
            .timeout(1000)
            .build()
        MyCoilMgr.INSTANCE.enqueue(req)
相关推荐
Android系统攻城狮10 小时前
Linux Gstreamer深度解析之gst_audio_encoder_set_frame_max调用流程与实战(六十一)
android·linux·运维·音视频·gstreamer音视频·音视频进阶·gstreamer音视频进阶
传奇开心果编程14 小时前
【Compose Multiplatform 跨端开发学与练】第7课 平台适配与互操作
android·windows·学习·ui·ios·kotlin·composer
mmsx14 小时前
Android 地图数据链路:从 GDAL、KML 到多引擎适配
android·kotlin
2601_9689007714 小时前
大模型版本回归评估实战:从能力指标到额度口径的完整链路
android·数据挖掘·回归
ao-weilai16 小时前
MySQL数据库:基本查询
android·数据库·mysql
事圆则缓17 小时前
Kotlin 泛型方差实战:out、in、星投影与类型擦除
android·开发语言·kotlin
传奇开心果编程19 小时前
【Compose Multiplatform 跨端开发学与练】第5课 网络与数据层
android·网络·学习·ui·ios·kotlin·composer
ao-weilai20 小时前
MySQL数据库:内置函数
android·数据库·mysql
SWAGGY..20 小时前
【C++进阶】:(7)红黑树的原理与 C++ 实现:结构设计、插入调整及性质验证
android·java·开发语言·c++·算法
Android打工仔20 小时前
CoroutineScheduler 设计解析(上)—— 为什么 Dispatchers.IO 会创建更多线程?
android·kotlin·源码阅读