Imperative style
// Coroutine scope
val request = ImageRequest.Builder(context)
.data("https:////w.example.com/image.jpg")
.build()
val result = imageLoader.execute(request) // Suspends the execution
val drawable = result.drawable
ImageLoader
● A service class responsible for executing and managing
entire pipeline.
Slide 31
Slide 31 text
ImageLoader
● A service class responsible for executing and managing
entire pipeline.
● Takes ImageRequest.
Slide 32
Slide 32 text
ImageLoader
● A service class responsible for executing and managing
entire pipeline.
● Takes ImageRequest.
● COIL provides singleton (Recommended)
Slide 33
Slide 33 text
ImageLoader
// enqueue
val request = ImageRequest.Builder(context)
.data("https:////w.example.com/image.jpg")
.target(imageView)
.build()
val disposable = imageLoader.enqueue(request)
Slide 34
Slide 34 text
ImageLoader
// execute
val request = ImageRequest.Builder(context)
.data("https:////w.example.com/image.jpg")
.build()
val result = imageLoader.execute(request) // Suspends the execution
Interceptors
● Allows you to observe, transform, short circuit or retry
request
Slide 38
Slide 38 text
Interceptors
● Allows you to observe, transform, short circuit or retry
request
● You can wrap the pipeline with your custom logic
Slide 39
Slide 39 text
Interceptors
● Allows you to observe, transform, short circuit or retry
request
● You can wrap the pipeline with your custom logic
● Inspired from OKHttp’s interceptor
Slide 40
Slide 40 text
class CustomCacheInterceptor(
private val context: Context,
private val cache: LruCache
) : Interceptor {
override suspend fun intercept(chain: Interceptor.Chain): ImageResult {
val value = cache.get(chain.request.data.toString())
if (value /= null) {
return SuccessResult(
drawable = value.bitmap.toDrawable(context),
request = chain.request,
metadata = TODO()
)
}
return chain.proceed(chain.request)
}
}
Slide 41
Slide 41 text
class CustomCacheInterceptor(
private val context: Context,
private val cache: LruCache
) : Interceptor {
override suspend fun intercept(chain: Interceptor.Chain): ImageResult {
val value = cache.get(chain.request.data.toString())
if (value /= null) {
return SuccessResult(
drawable = value.bitmap.toDrawable(context),
request = chain.request,
metadata = TODO()
)
}
return chain.proceed(chain.request)
}
}
Slide 42
Slide 42 text
class CustomCacheInterceptor(
private val context: Context,
private val cache: LruCache
) : Interceptor {
override suspend fun intercept(chain: Interceptor.Chain): ImageResult {
val value = cache.get(chain.request.data.toString())
if (value /= null) {
return SuccessResult(
drawable = value.bitmap.toDrawable(context),
request = chain.request,
metadata = TODO()
)
}
return chain.proceed(chain.request)
}
}
Slide 43
Slide 43 text
class CustomCacheInterceptor(
private val context: Context,
private val cache: LruCache
) : Interceptor {
override suspend fun intercept(chain: Interceptor.Chain): ImageResult {
val value = cache.get(chain.request.data.toString())
if (value /= null) {
return SuccessResult(
drawable = value.bitmap.toDrawable(context),
request = chain.request,
metadata = TODO()
)
}
return chain.proceed(chain.request)
}
}
Slide 44
Slide 44 text
class CustomCacheInterceptor(
private val context: Context,
private val cache: LruCache
) : Interceptor {
override suspend fun intercept(chain: Interceptor.Chain): ImageResult {
val value = cache.get(chain.request.data.toString())
if (value /= null) {
return SuccessResult(
drawable = value.bitmap.toDrawable(context),
request = chain.request,
metadata = TODO()
)
}
return chain.proceed(chain.request)
}
}
Mappers
● Allows you to add support for custom data types
Slide 50
Slide 50 text
Mapper - Example
data class Item(
val id: Int,
val imageUrl: String,
val price: Int,
val weight: Double
)
class ItemMapper : Mapper {
override fun map(data: Item) = data.imageUrl
}
Slide 51
Slide 51 text
Mapper - Example
data class Item(
val id: Int,
val imageUrl: String,
val price: Int,
val weight: Double
)
class ItemMapper : Mapper {
override fun map(data: Item) = data.imageUrl
}
Engine
Interceptor
Is in strong
memory?
Key
Yes
Return Bitmap
and short
circuit image
loading pipeline
Slide 80
Slide 80 text
Engine
Interceptor
Is in strong
memory?
Key
Yes
Return Bitmap
and short
circuit image
loading pipeline
No
Is in
weak
memory?
Slide 81
Slide 81 text
Engine
Interceptor
Is in strong
memory?
Key
Yes
Return Bitmap
and short
circuit image
loading pipeline
No
Is in
weak
memory?
Yes
Return Bitmap
and short
circuit image
loading pipeline
Slide 82
Slide 82 text
Engine
Interceptor
Is in strong
memory?
Key
Yes
Return Bitmap
and short
circuit image
loading pipeline
No
Is in
weak
memory?
No
Execute Image
loading
pipeline
Yes
Return Bitmap
and short
circuit image
loading pipeline
Slide 83
Slide 83 text
Strong Memory Cache
● Backed by LRU cache
Slide 84
Slide 84 text
Strong Memory Cache
● Backed by LRU cache
● Size of the cache is computed dynamically