Bir uygulama içinde periyodik görevlerin tekrarlanması ortak bir gerekliliktir. Bu işlev, ağı yoklama, manuel animasyonlar çalıştırma veya yalnızca kullanıcı arayüzünü güncelleme için kullanılabilir. Periyodik görevleri çalıştırmanın en az dört yolu vardır:
- Handler – Opsiyonel bir gecikmeden sonra UIThread’de çalıştırılabilir bir görevi yürütür.
- ScheduledThreadPoolExecutor – Bir arka plan iş parçacığı havuzu ile periyodik görevleri yürütür.
- AlarmManager – Periyodik bir görevin arka planda bir hizmet olarak yürütür.
- TimerTask – UIThread’de çalışmıyor ve güvenilir değil. Asla TimerTask kullanmayın. Fikir
Önerilen yöntemler aşağıda özetlenmiştir.
Handler
Belirli bir iş parçacığında, belirli bir iş parçacığı üzerinde bir gecikme sonrasında kodu çalıştırmak veya görevleri iş parçacığında periyodik olarak tekrarlamak için handler kullanabilirsiniz. Bu, bir handler oluşturup işlenecek iş parçacığındaki olay iletisi sırasına “çalıştırılabilir kod” gönderir.
Gecikmeden Sonra Kodu Çalıştırma
Bir Handler kullanarak, belirtilen bir gecikmeden sonra rasgele kodu bir kez çalıştırabiliriz:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
// Handler paketini kullanmamız gerekiyor import android.os.Handler; // Handler nesnesini oluştur (varsayılan olarak main thread de) Handler handler = new Handler(); // Çalıştırılacak kod bloğunu tanımla private Runnable runnableCode = new Runnable() { @Override public void run() { // Ana iş parçacığında yapmak istediğiniz şeyler Log.d("Handlers", "Called on main thread"); } }; // Yukarıdaki kod bloğunu ana iş parçacığında 2 saniye sonra çalıştırın handler.postDelayed(runnableCode, 2000); |
Yinelenen Kodu Belirtilen Aralığa Göre Çalıştırma
Benzer bir teknik kullanarak, periyodik bir çalıştırılabilir görevi aşağıda gösterildiği gibi yürütmek için de bir handler kullanabilirsiniz:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
// Handler paketini kullanmamız gerekiyor import android.os.Handler; // Handler nesnesini oluştur (varsayılan olarak main thread de) Handler handler = new Handler(); // Çalıştırılacak kod bloğunu tanımla private Runnable runnableCode = new Runnable() { @Override public void run() { // Ana iş parçacığında yapmak istediğiniz şeyler Log.d("Handlers", "Called on main thread"); // çalıştırılabilir kod bloğunu 2 saniye daha tekrarlayın // 'this' Runnable objesini refere ediyor handler.postDelayed(this, 2000); } }; // Handlere göndererek ilk çalıştırılabilir görevi başlatın. handler.post(runnableCode); |
Bir zamanlanmış yürütmeyi aşağıdakiyle kaldırabiliriz:
1 2 |
// Bekleyen kod yürütmesini kaldırır handler.removeCallbacks(runnableCode); |
Çalıştırılabilir kod bloğundaki kullanıcı arabirimini güvenle güncelleştirebilmeniz için bir Handler ile Runnable varsayılan olarak UIThread’de yürütülür.
ScheduledThreadPoolExecutor
Arka planda periyodik olarak yürütülecek komutları zamanlayabilen bir iş parçacığı havuzu. Birden fazla çalışan iş parçacığı gerektiğinde, ancak genelde bu işe yaramazsa kullanışlıdır.
Nasıl çalıştıklarına ilişkin bu kılavuzu veya bu stackoverflow postunu inceleyin.
AlarmManager
Bu, periyodik görevlerin uygulama ön planda olmadığında bile arka planda durdurulana kadar kesintisiz olarak çalışacak bir hizmetin periyodik olarak çalışması gerekiyorsa kullanılmalıdır.
Ayrıntılar için servis kılavuzunun AlarmManager bölümüne bakın.