Saya merancang aplikasi yang memiliki tugas berulang untuk mengirimkan kehadiran ke server khusus selama aplikasi berada di latar depan.
Dalam penelusuran saya di seluruh web, saya melihat beberapa pendekatan berbeda dan ingin tahu cara terbaik untuk melakukan ini.
Apa cara terbaik untuk menjadwalkan panggilan server?
Opsi yang saya lihat adalah:
Timer .
Layanan .
BroadcastReciever dengan AlarmManager .
Apa pendapatmu?
EDIT:
Alasan saya memerlukan ini adalah untuk aplikasi berbasis obrolan yang mengirimkan semua tindakan pengguna ke server jarak jauh.
yaitu pengguna mengetik pesan, pengguna membaca pesan, pengguna online, pengguna offline dll.
Ini berarti bahwa sekali setiap interval, saya perlu mengirim server apa yang saya lakukan, karena saya membuka ruang obrolan dengan orang lain, mereka perlu tahu apa yang saya lakukan.
Mirip dengan mekanisme umpan balik pesan whatsapp:
EDIT # 2:
Tugas berulang sekarang seharusnya dijadwalkan hampir selalu melalui JobScheduler
API (atau FirebaseJobDispatcher
untuk API yang lebih rendah) untuk mencegah masalah pengurasan baterai seperti yang dapat dibaca di bagian vital dari pelatihan Android
EDIT # 3:
FirebaseJobDispatcher sudah tidak digunakan lagi dan diganti dengan Workmanager , yang juga menggabungkan fitur JobScheduler.
sumber
Jawaban:
Saya tidak yakin tetapi menurut pengetahuan saya, saya berbagi pandangan saya. Saya selalu menerima jawaban terbaik jika saya salah.
Manajer Alarm
Manajer Alarm menahan penguncian bangun CPU selama
onReceive()
metode penerima alarm sedang dijalankan. Ini menjamin bahwa telepon tidak akan tidur sampai Anda selesai menangani siaran. SetelahonReceive()
kembali, Manajer Alarm melepaskan kunci bangun ini. Artinya, dalam beberapa kasus ponsel akan tidur segera setelahonReceive()
metode Anda selesai. Jika penerima alarm Anda meneleponContext.startService()
, ada kemungkinan ponsel akan tidur sebelum layanan yang diminta diluncurkan. Untuk mencegah hal ini, AndaBroadcastReceiver
danService
perlu menerapkan kebijakan penguncian layar saat aktif terpisah untuk memastikan bahwa ponsel terus berjalan hingga layanan tersedia.Catatan: Manajer Alarm ditujukan untuk kasus di mana Anda ingin kode aplikasi Anda dijalankan pada waktu tertentu, bahkan jika aplikasi Anda saat ini tidak berjalan. Untuk operasi pengaturan waktu normal (tick, timeout, dll) lebih mudah dan lebih efisien untuk menggunakan Handler.
Timer
Timer
memiliki beberapa kekurangan yang dapat diatasiScheduledThreadPoolExecutor
. Jadi itu bukan pilihan terbaikScheduledThreadPoolExecutor .
Anda dapat menggunakan
java.util.Timer
atauScheduledThreadPoolExecutor
(lebih disukai) untuk menjadwalkan tindakan agar terjadi secara berkala di thread latar belakang.Berikut ini contoh yang menggunakan yang terakhir:
Jadi saya lebih suka
ScheduledExecutorService
Tetapi juga pikirkan tentang bahwa jika pembaruan akan terjadi saat aplikasi Anda berjalan, Anda dapat menggunakan
Timer
, seperti yang disarankan dalam jawaban lain, atau yang lebih baruScheduledThreadPoolExecutor
. Jika aplikasi Anda akan diperbarui bahkan saat tidak berjalan, Anda harus menggunakanAlarmManager
.Perhatikan bahwa jika Anda berencana memperbarui saat aplikasi Anda dimatikan, cukup sering setiap sepuluh menit, dan dengan demikian mungkin sedikit terlalu memakan daya.
sumber
Timer
Seperti yang disebutkan di javadocs Anda lebih baik menggunakan ScheduledThreadPoolExecutor.
ScheduledThreadPoolExecutor
Gunakan kelas ini jika kasus penggunaan Anda memerlukan beberapa utas pekerja dan interval tidurnya kecil. Seberapa kecil? Yah, menurutku sekitar 15 menit. The
AlarmManager
dimulai menjadwalkan interval saat ini dan tampaknya menunjukkan bahwa untuk interval tidur yang lebih kecil kelas ini dapat digunakan. Saya tidak punya data untuk mendukung pernyataan terakhir. Itu adalah firasat.Layanan
Layanan Anda dapat ditutup kapan saja oleh VM. Jangan gunakan layanan untuk tugas berulang. Tugas berulang dapat memulai layanan, yang merupakan masalah lain sepenuhnya.
BroadcastReciever dengan AlarmManager
Untuk interval tidur yang lebih lama (> 15 menit), inilah caranya.
AlarmManager
sudah memiliki konstanta (AlarmManager.INTERVAL_DAY
) yang menunjukkan bahwa ini bisa memicu tugas beberapa hari setelah awalnya dijadwalkan. Itu juga dapat membangunkan CPU untuk menjalankan kode Anda.Anda harus menggunakan salah satu solusi tersebut berdasarkan waktu dan kebutuhan thread pekerja Anda.
sumber
Saya menyadari ini adalah pertanyaan lama dan telah dijawab tetapi ini dapat membantu seseorang. Di Anda
activity
Di
onCreate
sumber
Mengutip Alarm Berulang Penjadwalan - Pahami kompromi dokumen:
Jadi, berdasarkan ini, cara terbaik untuk menjadwalkan panggilan server adalah menggunakan Google Cloud Messaging (GCM) bersama dengan adaptor sinkronisasi .
sumber
Saya telah membuat tugas tepat waktu di mana tugas yang ingin diulang pengguna, tambahkan metode run () Tugas Waktu Kustom. itu berhasil berulang.
}
sumber