Screen Shot 2016-02-23 at 22.40.34

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.

Screen Shot 2016-02-23 at 22.55.08

Eğer cachelenmemesi gereken bir request olursa, aşağıdaki gibi kullanılabilir.

Screen Shot 2016-02-23 at 23.04.19

Eğer data gelene kadar cache’den okuyup sonra refresh etmesi gereken bir durum olursa da aşağıdaki gibi kullanılabilir.

Screen Shot 2016-02-23 at 23.04.25

Burada data cihazdan sadece 2 şekilde kaldırılır.

  1. Cache tamamen dolduysa
  2. Cache kontrol Header’ına göre

Screen Shot 2016-02-23 at 23.02.37

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