SQLite
 sql >> Teknologi Basis Data >  >> RDS >> SQLite

IntentService membekukan UI aplikasi saya

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.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. id baris sqlite tidak cocok dengan tampilan daftar - ANDROID

  2. hapus database sqlite saat memperbarui versi aplikasi baru

  3. 2 Cara Menghapus Baris Duplikat di SQLite

  4. Membuat Aplikasi Rekomendasi Film Django Menggunakan Indeks Jaccard

  5. Cara mengembangkan aplikasi Android asli offline-pertama