Apakah Anda benar-benar yakin bahwa itu adalah IntentService
itu akar penyebab UI membeku? Layanan maksud dirancang khusus untuk berjalan di utas pekerja untuk membongkar pemrosesan dari utas (UI) utama, dengan salah satu alasan utama untuk membantu mencegah UI membeku.
Mungkin coba mulai upaya debug Anda di tingkat UI. Secara khusus, apa yang menyediakan ResultReceiver
ke IntentService
ketika Anda memulainya, dan apa yang Anda lakukan di onReceiveResult
metode panggilan balik dalam contoh penerima itu?
Selain itu, untuk aktivitas yang Anda alami macet, periksa jenis operasi apa yang Anda lakukan. Memuat data dalam jumlah besar dari database di thread utama (yaitu tanpa menggunakan Loader
atau sesuatu yang mirip dengan membongkar pemrosesan ke utas pekerja) adalah penyebab umum UI membeku, setidaknya menurut pengalaman saya sejauh ini.
Perbarui
Saya pikir saya sudah mencari tahu apa masalahnya. Ada dua masalah utama, keduanya berasal dari cara Anda menggunakan Volley. Saat Anda menambahkan permintaan ke antrian Volley, permintaan itu akan dieksekusi secara tidak sinkron. Artinya queue
metode kembali segera. Dalam kode layanan maksud Anda, ini berarti layanan segera melanjutkan untuk memberi tahu ResultReceiver
bahwa itu telah selesai diproses, padahal sebenarnya yang dilakukan hanyalah mengantre permintaan. Kelima layanan maksud akan melakukan ini, artinya MainActivity
akan dimasuki dengan sangat cepat. Ini adalah masalah pertama.
Masalah kedua menjelaskan pembekuan yang Anda alami. Meskipun Volley mengeksekusi permintaan pada utas pekerja, ia mengembalikan respons yang diuraikan ke permintaan di utas utama - lihat dokumentasi di sini. Ini berarti bahwa semua pemrosesan respons yang Anda lakukan di layanan maksud (memasukkan data ke dalam database, dll.) sebenarnya terjadi di utas (UI) utama. Ini menjelaskan pembekuan.
Apa yang mungkin ingin Anda lakukan di sini adalah beralih menggunakan RequestFuture
Vol Volley sebagai gantinya. Ini pada dasarnya mengubah permintaan asinkron menjadi permintaan sinkron dengan mengizinkan Anda memblokir hingga permintaan selesai. Untuk melakukan ini, buat masa depan dari jenis yang sesuai (JSONObject
dalam kasus Anda) dan atur sebagai pendengar dan pendengar kesalahan untuk permintaan tersebut. Kemudian, antri permintaan seperti yang Anda lakukan sekarang, dan segera setelah itu panggil panggilan get
metode di masa depan. Metode ini akan memblokir hingga respons selesai diproses. Tidak apa-apa untuk melakukan ini di layanan maksud karena ini berjalan di thread pekerja, bukan thread UI.
Jika permintaan berhasil, Anda akan mendapatkan data yang dikembalikan dan Anda dapat menjalankan semua logika yang saat ini ada di Response.Listener
Anda penerapan. Jika terjadi kesalahan (yaitu permintaan gagal karena alasan tertentu), permintaan di masa mendatang akan mengeluarkan pengecualian yang dapat Anda tangani untuk mengambil tindakan yang sesuai.
Menggunakan request futures adalah pendekatan yang sangat berbeda untuk menggunakan listener dan Anda mungkin perlu sedikit mengubah kode agar berfungsi, tetapi ini akan menyelesaikan masalah yang Anda lihat.
Semoga membantu, dan saya dengan tulus meminta maaf karena tidak mengetahui bug sebelumnya.