Seize the day

POST : Android Dev Study

Picasso 라이브러리에 OFFLINE 파일 캐시를 적용하기

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
            }
        }
    }
}


top

posted at

2017. 12. 2. 19:52


CONTENTS

Seize the day
BLOG main image
김대정의 앱 개발 노트와 사는 이야기
RSS 2.0Tattertools
공지
아카이브
최근 글 최근 댓글
카테고리 태그 구름사이트 링크