Bir CursorLoader uygulamanızın arka planında bir ContentProvider'a (veri sağlayıcı) dayalı eşzamansız (asenkron) sorgular çalıştırmanıza yarar. Bu sayede ContentProvider'lar ile çalışırken uygulamanızın ön yüzünde herhangi bir performans kaybının önüne geçebilirsiniz. CursorLoader aynı zamanda yaptığı sorguların sonucunu, kendini çağıran bileşene (Activity ya da FragmentActivity gibi) döndürür. Bu sayede Activity veya FragmentActivity, o sırada sorgu çalışmaya devam ederken bile kullanıcıyla rahatlıkla etkileşime geçer.
CursorLoader'ı kullanan Activity'yi tanımlamak
CursorLoader'ı Activity veya FragmentActivity ile kullanmak için LoaderCallbacks<Cursor> arayüzünü (interface) kullanmanız gerekiyor. Bir CursorLoader, bu arayüzde tanımlanmış callback metotlarını çağırarak onu kullanan sınıfla haberleşir; bu eğitim içeriğinde ve sonrakinde bu callback metotlarını ayrıntılarıyla işleyeceğiz.
Örnek olarak CursorLoader'ın Android Destekleme Kütüphanesi'ndeki sürümünü kullanan bir FragmentActivity'nin nasıl tanımlanacağını görelim. FragmentActivity'yi türeterek (extend) CursorLoader desteği kazandığınız gibi Fragment desteği de kazanırsınız. FragmentActivity'nin normal Activity'den en önemli farkı budur desek, yanlış olmaz.
public class PhotoThumbnailFragment extends FragmentActivity implements
LoaderManager.LoaderCallbacks {
...
}
Sorguyu ilklendirmek (Initialization)
Bir sorguyu ilklendirmek için LoaderManager.initLoader() metodunu çağırmalısınız. Bu işlem arka planda ilgili framework'ü ilklendirir. Bu işlemin ardından kullanıcının girdiği veriyi sorguda kullanabilir veya kullanıcının verileriyle bir işiniz yoksa bu işlemi onCreate() ya da onCreateView() metotlarında gerçekleştirebilirsiniz. Bir örneğe bakalım:
// o anki bileşende (Activity gibi) kullanılacak
// özel Loader'ı tanımlar
private static final int URL_LOADER = 0;
...
/* Sistem Fragment'ı göstermeye hazır olduğunda
* bu metot ile Fragment'ın View'ını gösterir
*/
public View onCreateView(
LayoutInflater inflater,
ViewGroup viewGroup,
Bundle bundle) {
...
/*
* CursorLoader'ı ilklendirir. Buradaki URL_LOADER
* değeri sonunda LoaderManager'ın onCreateLoader()
* metoduna gider
*/
getLoaderManager().initLoader(URL_LOADER, null, this);
...
}
NOT: getLoaderManager() metodu sadece Fragment sınıfında geçerlidir. Eğer LoaderManager'ı bir FragmentActivity içinde elde etmek isterseniz bu sefer getSupportLoaderManager()'ı çağırmalısınız.
Sorguyu başlatmak
Loader'ları yöneten arka plan framework'ü ilklendiğinde yani başlamaya hazır olduğunda artık onCreateLoader() metodundaki kodlarınızı çağırabilir. Sorguyu başlatmak için bu metot ile bir CursorLoader döndürmelisiniz. Boş bir CursorLoader oluşturduktan sonra sonra, onun metotlarını sorgunuzu tanımlamak için kullanabilirsiniz veya oluşturup aynı anda sorgunuzu da tanımlayabilirsiniz:
/*
* Sistem Loader'ı ilklendirdiğinde çağrılacak ve sorguyu başlatmaya
* hazır callback metodudur. Bu metot genellikle initLoader() çağrıldıktan
* sonra çağrılır. loaderID parametersi initLoader() çağrısına verilen
* ID değeriyle aynıdır.
*/
@Override
public Loader
onCreateLoader (int loaderID, Bundle bundle) {
/*
* oluşturulmuş olan Loader'ın ID değerine göre
* aksiyon alıyoruz
*/
switch (loaderID) {
case URL_LOADER:
// yeni bir CursorLoader döndürür
return new CursorLoader(
getActivity(), // Üst Activity'nin Context'i
mDataUrl, // sorgulanacak tablo
mProjection, // döndürülecek veriye ilişkin şart
null, // seçim cümleciği yok
null, // seçim cüm. için parametre yok
null // varsayılan (ASC) sıralama
);
default:
// içeri hatalı bir ID verilmişse
return null;
}
}
Arka plan framework'ü nesneyi ulaştıktan sonra sorguyu hemen arka planda başlatır. Sorgunun işi bitince de yine arka planda onLoadFinished() metodunu çağırır. Bu metoda ilişkin bilgileri bir sonraki eğitim içeriğinde bulabilirsiniz.
Bu sayfadaki parçalar Android Open Source Project kapsamında oluşturulmuş ve paylaşılmış içeriğin küçük değişiklikler yapılmış hâlidir ve Creative Commons 2.5 Attribution License'ta belirlenen koşullara göre kullanılmıştır.
Bu eğitim içeriğinin orijinal hâline buradan ulaşabilirsiniz: Running a Query with a CursorLoader