Picasso는 기본적으로 network에서만 이미지를 로드하는데 이미지를 파일캐시에 저장하고 로드할 때도 파일 캐시를 먼저 체크하고 그 이후에 네트워크에서 불러오도록 적용해보았다.
OkHttpDownloaderDiskCacheFirst 클래스는 https://stackoverflow.com/questions/23978828/how-do-i-use-disk-caching-in-picasso 에서 가져왔다.
Picasso.with 대신에 Pikasso.with들 사용하면된다. 이미지 캐시 만료시간은 1년이고, 캐시의 용량제한은 없지만, 코드는 쉽게 수정가능하다.
import android.content.Context import android.net.Uri import com.squareup.okhttp.Cache import com.squareup.okhttp.Interceptor import com.squareup.okhttp.OkHttpClient import com.squareup.picasso.Downloader import com.squareup.picasso.OkHttpDownloader import com.squareup.picasso.Picasso import java.io.File import java.io.IOException object Pikasso { private var picasso: Picasso? = null fun with(_context: Context): Picasso { if (picasso == null) { val context = _context.applicationContext val okHttpClient = OkHttpClient() okHttpClient.networkInterceptors().add(Interceptor { chain -> val originalResponse = chain.proceed(chain.request()) originalResponse.newBuilder().header("Cache-Control", "public, max-age=" + 60 * 60 * 24 * 365).build() }) okHttpClient.cache = Cache(File(context.cacheDir, "picasso-cache"), Long.MAX_VALUE) val okHttpDownloader = OkHttpDownloaderDiskCacheFirst(okHttpClient) picasso = Picasso.Builder(context).downloader(okHttpDownloader).build() Picasso.setSingletonInstance(picasso) } return picasso!! } class OkHttpDownloaderDiskCacheFirst(client: OkHttpClient) : OkHttpDownloader(client) { @Throws(IOException::class) override fun load(uri: Uri, networkPolicy: Int): Downloader.Response { var responseDiskCache: Downloader.Response? = null try { responseDiskCache = super.load(uri, 1 shl 2) //NetworkPolicy.OFFLINE } catch (ignored: Exception) { } // ignore, handle null later return if (responseDiskCache == null || responseDiskCache!!.getContentLength() <= 0) { super.load(uri, networkPolicy) //user normal policy } else { responseDiskCache } } } }