Neden ihtiyacımız
var?
Yanıt basit; çünkü Cursor Loader
query fonksiyonunu ve devamında sonuçları işlemeyi arkaplan thread i olarak
yapmaktadır. Bu nedenle uzun zaman alan SQlite işlerinde normal thread ler gibi
kullanıcı arayüzünü (UI) kilitlememektedir.
Eski yöntemi :
Activity.managerQuery.
Ne zaman
kullanmamız lazım?
SQlite tan
veri çekeceğimiz her zaman kullanılabilir. Arkaplan işi olduğu için ne kadar
sürerse sürsün kullanıcıyı rahatsız eden UI kilitlemeye neden olmayacaktır.
Nasıl kullanılır?
Başlangıç;
Kullanabilmek için ilk önce
Content Provider dan bir query döndürebilmemiz lazım. Hadi basit bir query
methodu yazalım. İçerisinde Android telefon modellerinin sıralandığı bir
database imizin olduğunu varsayalım. Ve query sonunda bu listenin dönmesini
sağlayalım. Bunun dışında query yi yavaşlatmak için kodun içine Thread.sleep()
methodunu ekleyelim. Sonuç olarak beş saniye bekledikten sonra databaseden
query dönecek özellikle yavaş çalışması için yazılmış bir methodumuz oldu.
public static
CursorLoader getCursorLoader(Context paramContext) {
Log.i(TAG,"try
to block query");
Thread.sleep(5000);
//miliseconds
String[] a = { Boolean.toString(false) };
return new
CursorLoader(paramContext, Your.URI, ColumnNamesYouWantToQuery, null, null, "_id
ASC ");
}
Bu query
nin aşağıdaki basit listeyi döndürdüğünü varsayalım.
String[]{"Samsung Galaxy S6","HTC One M9","Sony Xperia Z5","LG G4", "Nexus 5X", "Nexus 6P"}
Bu basit listenin dışında database isteğe bağlı olarak
farklı kaynaklarda doldurulabilir.
Kullanım;
Cursor Loader ı implement olarak almış basit bir class
yazalım.
CursorLoaderActivity .java
package com.kozaxinan.sekreter;
import android.app.ListActivity;
import android.app.LoaderManager;
import
android.content.CursorLoader;
import android.content.Intent;
import android.content.Loader;
import android.database.Cursor;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.ListView;
public class CursorLoaderActivity extends ListActivity implements
LoaderManager.LoaderCallbacks<Cursor> {
@Override
public void
onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
}
@Override
protected void
onResume() {
// cursor loader ı tekrar çalıştırmak için
getLoaderManager().restartLoader(0,
null, this);
super.onResume();
}
@Override
public
Loader<Cursor> onCreateLoader(int
arg0, Bundle arg1) {
//Burada
arkaplan işi olarak istenilen query çağırılır.
CursorLoader localCursorLoader = getCursorLoader(this);
return
localCursorLoader;
}
@Override
public void
onLoadFinished(Loader<Cursor> arg0, Cursor localCursor) {
//query
bittikten sonra onunla istediğimizi yapacağımız yer burası
localCursor.close();
}
@Override
public void
onLoaderReset(Loader<Cursor> arg0) {
}
}
Yeni bir API!!!
Cursor
Loader yeni bir API. Android SDK level 11 den sonra kullanımı var. Fakat Google
Android takımı bu yararlı API yi uyumluluk paketine dahil ettiler.
(Compatibility/support library)
Cursor
Loader ın Fragment Activity ile çalışma şekli çağırılış açısından farklıdır;
getSupportLoaderManager().initLoader(LOADER_ID, null, this);
Bu methodu Fragment ile kullanırken kendi seçtiğimiz bir
LOADER_ID vermemiz lazım.
Cursor Loader ı kullanmak çok kolay ve kazandırdıkları
uygulamanıza eklerken harcayacağınız zamandan kat ve kat fazladır.
Uygulamalarınızda kullanıp sonuçları test ederek görebilirsiniz.
Sinan KOZAK
Elektronik Mühendisi
Comments
Post a Comment