Skip to content

Image Loader

ImageLoader 是執行 ImageRequest服務物件。它們處理快取、資料擷取、圖片解碼、請求管理、記憶體管理等作業。

當您建立單一 ImageLoader 並在整個應用程式中共用它時,Coil 的效能表現最佳。這是因為每個 ImageLoader 都擁有自己的記憶體快取、磁碟快取和 OkHttpClient

Singleton

預設的 io.coil-kt.coil3:coil 構件附帶一個單例 ImageLoader。Coil 會延遲建立此 ImageLoader。可以透過多種方式進行配置:

kotlin
// setSafe 方法可確保它不會覆蓋
// 已建立的現有影像載入器。
SingletonImageLoader.setSafe {
    ImageLoader.Builder(context)
        .crossfade(true)
        .build()
}

// SingletonImageLoader.setSafe 的別名,對 
// Compose Multiplatform 應用程式很有用。
setSingletonImageLoaderFactory { context ->
    ImageLoader.Builder(context)
        .crossfade(true)
        .build()
}

// 僅應在測試中使用。如果您多次呼叫此方法,
// 它將建立多個影像載入器。
SingletonImageLoader.setUnsafe {
    ImageLoader.Builder(context)
        .crossfade(true)
        .build()
}

// 在 Android 上,您可以在 Application 類別中
// 實作 SingletonImageLoader.Factory,使其建立單例影像載入器。
class CustomApplication : SingletonImageLoader.Factory {
    override fun newImageLoader(context: Context): ImageLoader {
        return ImageLoader.Builder(context)
            .crossfade(true)
            .build()
    }
}

在所有情況下,請確保上述方法在應用程式啟動時盡快調用(例如:在 Application.onCreate 內,或者如果您的應用程式只有單一 Activity,則在 MainActivity.onCreate 內)。

相依注入

如果您有較大型的應用程式或想要管理自己的 ImageLoader,您可以改為相依於 io.coil-kt.coil3:coil-core 而非 io.coil-kt.coil3:coil

這種做法讓限定虛擬 ImageLoader 的生命週期變得更容易,且總體上會讓測試更簡單。

快取

每個 ImageLoader 都會保留最近解碼的 Bitmap 的記憶體快取,以及從網際網路載入之任何圖片的磁碟快取。這兩者都可以在建立 ImageLoader 時進行配置:

kotlin
val imageLoader = ImageLoader.Builder(context)
    .memoryCache {
        MemoryCache.Builder()
            .maxSizePercent(context, 0.25)
            .build()
    }
    .diskCache {
        DiskCache.Builder()
            .directory(context.cacheDir.resolve("image_cache"))
            .maxSizePercent(0.02)
            .build()
    }
    .build()

您可以使用金鑰存取記憶體與磁碟快取中的項目,這些金鑰會在圖片載入後透過 ImageResult 傳回。ImageResultImageLoader.execute 傳回,或在 ImageRequest.Listener.onSuccessImageRequest.Listener.onError 中傳回。