Skip to main content

Cursor Loader nasıl kullanılır? Örnek



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

Popular posts from this blog

How to change position of MyLocationButton on new Map API v2 - 2

In my previuos post[1], i mention a workaround for changing buttons on Google Map which we use with google services. It is good to know they listen developers and make their products more development friendly. (I hope it goes like that way all the time and all the product lines of Google) Now we have a method for setting padding of map. It is add padding to useful area of map. We can see full screen map but with padding we can use prefered area of it. It is good for overlay action bar and other things on map view. [ 2] They write a blog and take a video about it. Read blog and watch video if you are using google map in your app :) [3] And finally, They add this method because of this issue. That means, if you find a bug or want extra feature from and api, write to google via this issue tracking system. [1] http://blog.kozaxinan.com/2013/08/how-to-change-position-of.html [2] https://developers.google.com/maps/documentation/android/map#map_padding [3] http://googlegeodeve

How to set alarm to show a notification at future date with AlarmManager?

Lets assume you want to do a job a future time or show a notification at a selected time. AlarmManager can help to send an intent in future time. First we need to select date, Lets create a date in 2050, Calendar calendar = Calendar. getInstance () ; calendar.set(Calendar. YEAR , 2050 ) ; Date date = calendar.getTime() ; For showing notification we need a service. public class AlarmReceiver extends Service { public AlarmReceiver() { } @Override public IBinder onBind (Intent intent) { } } Add service to Manifest.xml <service android :name= "com.kozaxinan.example.alarm.AlarmReceiver" android :enabled= "true" android :exported= "true" > </service> We will modify AlarmReceiver for sending notification. But first we need to register a alarm. AlarmManager alarmManager = (AlarmManager) getSystemService( ALARM_SERVICE ) ; Intent intent = new Intent( this, AlarmReceiver. class ) ; intent.putExtra( &q

Meteor Crush

You are the last hope of world Hit meteors and save everyone Accelerate satellites and crush meteors.  Clear endless danger waves. Tear meteors to pieces so planet and all living things can live. Smash meteorites and help world. Meteor Crush https://play.google.com/store/apps/details?id=com.kozaxinan.meteorcrush