Apa arti dari pengecualian berikut; bagaimana saya bisa memperbaikinya?
Ini kodenya:
Toast toast = Toast.makeText(mContext, "Something", Toast.LENGTH_SHORT);
Ini pengecualian:
java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare()
at android.os.Handler.<init>(Handler.java:121)
at android.widget.Toast.<init>(Toast.java:68)
at android.widget.Toast.makeText(Toast.java:231)
android
ui-thread
android-toast
michael
sumber
sumber
compile 'com.shamanland:xdroid-toaster:0.0.5'
, itu tidak memerlukanrunOnUiThread()
atauContext
variabel, semua rutin hilang! hanya memohon diToaster.toast(R.string.my_msg);
sini adalah contoh: github.com/shamanland/xdroid-toaster-exampleJawaban:
Anda memanggilnya dari utas pekerja. Anda perlu memanggil
Toast.makeText()
(dan sebagian besar fungsi lain yang berurusan dengan UI) dari dalam utas utama. Anda bisa menggunakan pawang, misalnya.Cari Berkomunikasi dengan Thread UI di dokumentasi. Pendeknya:
Pilihan lain:
Anda bisa menggunakan AsyncTask , yang berfungsi dengan baik untuk sebagian besar hal yang berjalan di latar belakang. Ini memiliki kait yang dapat Anda panggil untuk menunjukkan kemajuan, dan ketika sudah selesai.
Anda juga bisa menggunakan Activity.runOnUiThread () .
sumber
(and most other functions dealing with the UI)
Contoh dari fungsi UI yang dapat digunakan dari latar belakang adalahandroid.support.design.widget.Snackbar
- fungsinya tidak berkurang ketika tidak menelepon dari utas UI.Anda perlu menelepon
Toast.makeText(...)
dari utas UI:Ini disalin dari jawaban SO (duplikat) lain .
sumber
UPDATE - 2016
Alternatif terbaik adalah dengan menggunakan
RxAndroid
(binding spesifik untukRxJava
) untukP
diMVP
untuk mengambil alih fo data.Mulailah dengan kembali
Observable
dari metode yang ada.Gunakan ini Teramati seperti ini -
-------------------------------------------------- -------------------------------------------------- ------------------------------
Saya tahu saya sedikit terlambat tetapi ini dia. Android pada dasarnya bekerja pada dua jenis utas yaitu utas UI dan utas latar . Menurut dokumentasi android -
Sekarang ada berbagai metode untuk mengatasi masalah ini.
Saya akan menjelaskannya dengan contoh kode:
runOnUiThread
LOOPER
AsyncTask
Handler
sumber
runOnUiThread
View
juga memiliki metodepost(Runnable)
danpostDelayed(Runnable, long)
! Banyak Penangan yang sia-sia. :)Toast.makeText()
seharusnya hanya dipanggil dari utas Utama / UI. Looper.getMainLooper () membantu Anda untuk mencapainya:Keuntungan dari metode ini adalah Anda dapat menggunakannya tanpa Aktivitas atau Konteks.
sumber
Coba ini, ketika Anda melihat runtimeException karena Looper tidak siap sebelum penangan.
sumber
android.os.Handler
Saya mengalami masalah yang sama, dan inilah cara saya memperbaikinya:
Untuk membuat UIHandler, Anda harus melakukan yang berikut:
Semoga ini membantu.
sumber
onCreate method
atau dari AsyncTask dalam situasi saya, tolong posting seluruh kode hanya untuk mempelajari cara kerjanya?uiHandler = new UIHandler(uiThread.getLooper());
?Alasan kesalahan:
Utas pekerja dimaksudkan untuk melakukan tugas-tugas latar belakang dan Anda tidak dapat menampilkan apa pun di UI dalam utas pekerja kecuali Anda memanggil metode seperti runOnUiThread . Jika Anda mencoba menampilkan sesuatu di utas UI tanpa memanggil runOnUiThread, akan ada a
java.lang.RuntimeException
.Jadi, jika Anda berada di sebuah
activity
tetapi meneleponToast.makeText()
dari utas pekerja, lakukan ini:Kode di atas memastikan bahwa Anda menampilkan pesan Toast di
UI thread
karena Anda memanggilnyarunOnUiThread
metode di dalam . Jadi tidak ada lagijava.lang.RuntimeException
.sumber
itulah yang saya lakukan.
Komponen visual "dikunci" untuk perubahan dari utas luar. Jadi, karena roti panggang menunjukkan hal-hal di layar utama yang dikelola oleh utas utama, Anda perlu menjalankan kode ini pada utas itu. Semoga itu bisa membantu :)
sumber
Saya mendapatkan kesalahan ini sampai saya melakukan hal berikut.
Dan menjadikan ini sebagai kelas tunggal:
sumber
Toaster.INSTANCE.postMessage(ResourceUtils.getString(R.string.blah));
(lama saya tahu! kami mengurangi ini nanti), meskipun saya belum pernah menggunakan bersulang untuk sementara waktuApplicationHolder.INSTANCE
dievaluasi?CustomApplication
set inCustomApplication.onCreate()
, mengingat aplikasi selalu ada saat proses ada, konteks ini dapat digunakan secara globalsumber
runOnUiThread(() -> { Toast toast = Toast.makeText(getApplicationContext(), "Message", Toast.LENGTH_SHORT); toast.show(); });
Solusi Kotlin yang luar biasa:
sumber
runOnUiThread
adalah bagian dari Activity yaituactivity?.runOnUiThread { ... }
Ini karena Toast.makeText () memanggil dari utas pekerja. Itu harus panggilan dari utas UI utama seperti ini
sumber
Jawaban oleh ChicoBird bekerja untuk saya. Satu-satunya perubahan yang saya lakukan adalah dalam penciptaan UIHandler di mana saya harus melakukan
Eclipse menolak menerima hal lain. Masuk akal kurasa.
Juga
uiHandler
jelas kelas global yang didefinisikan di suatu tempat. Saya masih tidak mengaku mengerti bagaimana Android melakukan ini dan apa yang sedang terjadi tetapi saya senang itu bekerja. Sekarang saya akan melanjutkan untuk mempelajarinya dan melihat apakah saya dapat memahami apa yang dilakukan Android dan mengapa seseorang harus melalui semua simpai dan simpang ini. Terima kasih atas bantuan ChicoBird.sumber
panggilan pertama
Looper.prepare()
dan kemudian panggilan panggilanToast.makeText().show()
terakhirLooper.loop()
seperti:sumber
Untuk Pengguna Rxjava dan RxAndroid:
sumber
Saya mengalami masalah yang sama ketika panggilan balik saya mencoba menampilkan dialog.
Saya memecahkannya dengan metode khusus dalam Kegiatan - pada tingkat anggota instance Kegiatan - yang digunakan
runOnUiThread(..)
sumber
Sekarang handler2 akan menggunakan Thread yang berbeda untuk menangani pesan dari Thread utama.
sumber
Untuk menampilkan dialog atau pemanggang di utas, cara paling ringkas adalah dengan menggunakan objek Aktivitas.
Sebagai contoh:
sumber
Bersulang, AlertDialogs harus berjalan di utas UI, Anda dapat menggunakan Asynctask untuk menggunakannya dengan benar dalam pengembangan android. Tapi beberapa kasus kita perlu menyesuaikan waktu menyendiri, jadi kami menggunakan Utas , tetapi di utas kami tidak dapat menggunakan Toast, Alertdialogs seperti yang kami gunakan di AsyncTask. Jadi kita perlu Handler terpisah untuk popup itu.
dalam contoh di atas saya ingin tidur utas saya dalam 3sec dan setelah saya ingin menampilkan pesan Toast, untuk itu dalam handler implement mainthread Anda .
Saya menggunakan sakelar di sini, karena jika Anda perlu menampilkan pesan yang berbeda dengan cara yang sama, Anda dapat menggunakan sakelar dalam kelas Handler ... harap ini akan membantu Anda
sumber
Ini biasanya terjadi ketika sesuatu di utas utama dipanggil dari utas latar belakang apa pun. Mari kita lihat contoh, misalnya.
Dalam contoh di atas, kami mengatur teks pada tampilan teks yang ada di utas utama UI dari metode doInBackground (), yang hanya beroperasi pada utas pekerja.
sumber
Saya memiliki masalah yang sama dan saya memperbaikinya hanya dengan meletakkan Toast di onPostExecute () mengesampingkan fungsi Asynctask <> dan berhasil.
sumber
saya menggunakan kode berikut untuk menampilkan pesan dari "konteks" bukan utas utama,
kemudian gunakan sebagai berikut:
sumber