Bir diğer konu da datayı nasıl alacağımız. Her seferinde servera gidilmeli mi, cachelenmeli mi? Eğer cache’lenmeliyse nasıl cachelenmeli?
Datayı cache’den okumak her seferinde servis çağırmaktan tabi ki daha performanslıdır. Eğer sürekli kullanılacak bir dataysa bu datayı cihaza cachelemek çok daha hızlı okunmasını sağlayabilir. Network’den bir dosya çektiğimizi ve bunu sonrasında da kullandığımızı düşünürsek cachelemek çok mantıklı bir çözüm.
Burada önrmli olan HTTP Responslarının cachelenmesi default’da disable’dır. Http Responselarını kullanarak cachelemek demek aslında HttpResponseCache class’ını kullanmak demektir.
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
…
try{
File httpCacheDir = new File(getBaseContext().getCacheDir(),“http”);
long httpCacheSize = 10*1024*1024; //10Mib
HttpResponseCache.install(httpCacheDir, httpCacheSize);
}catch (IOException e){
Log.i(TAG, “HTTP response cache installation failed.” + e.getMessage());
}
}
@Override
protected void onStop() {
super.onStop();
…
HttpResponseCache cache = HttpResponseCache.getInstalled();
if(null != cache){
cache.flush();
}
}
Ki bu da aslında cihazda fiziksek storage için bir lokasyon tanımlamamıza izin verir. Bu alan cache için ayrılarak max size kadar tanımlanır. Bir kere enabled edildiğinde ise, tüm Http Response’lar cachelenecektir. (dosya sisteminde) Bu tüm API’lara, URL connection’lara uygulanır. Tabi library’lerinde yaptığı tüm requestler cachelenir.
Eğer cachelenmemesi gereken bir request olursa, aşağıdaki gibi kullanılabilir.
Eğer data gelene kadar cache’den okuyup sonra refresh etmesi gereken bir durum olursa da aşağıdaki gibi kullanılabilir.
Burada data cihazdan sadece 2 şekilde kaldırılır.
- Cache tamamen dolduysa
- Cache kontrol Header’ına göre
HTTP 1.1 std server cihaza ne kadar süreyle cachelemesini gerektiğini söylüyor. 3 gün de olabilir hiç cacheleme de diyebilir. Basit network işlemlerinde ya da servera müdahale edebildiğimizde bu faydalı bir kullanım.
Eğer cache’i yönetemiyorsak ya da farklı bir cihazsa ve bu cihazda depolama yapamıyorsak, bu durumda kendi cache çözümümüzü yazmamış gerekir.
Bu noktada sıfırdan herşeyi yazmak zordur. DiskLRUCache.Java class’ından faydalanılabilir. Ya da aşağıdaki hazır library’lerden biri çözüm olarak kullanılabilir.
- Volley
- okHHTP
- Picasso
Picasso’nun kendi image cache mekanizması vardır.
Referanslar:
http://developer.android.com/reference/android/net/http/HttpResponseCache.html
Leave a Reply