Saya baru mengenal Android dan saya mencoba menggunakan UI-Thread, jadi saya telah menulis aktivitas pengujian sederhana. Tapi saya pikir saya telah salah mengerti sesuatu, karena saat mengklik tombol - aplikasi tidak merespon lagi
public class TestActivity extends Activity {
Button btn;
int i = 0;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
btn = (Button)findViewById(R.id.btn);
btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
runThread();
}
});
}
private void runThread(){
runOnUiThread (new Thread(new Runnable() {
public void run() {
while(i++ < 1000){
btn.setText("#"+i);
try {
Thread.sleep(300);
}
catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}));
}
}
Hanya bungkus sebagai fungsi, lalu panggil fungsi ini dari utas latar belakang Anda.
sumber
final
)Anda memilikinya back-to-front. Klik tombol Anda menghasilkan panggilan ke
runOnUiThread()
, tetapi ini tidak diperlukan, karena penangan klik sudah berjalan di utas UI. Kemudian, kode Anda dalamrunOnUiThread()
meluncurkan utas latar belakang baru, tempat Anda mencoba melakukan operasi UI, yang kemudian gagal.Sebaliknya, luncurkan utas latar belakang langsung dari penangan klik Anda. Kemudian, bungkus panggilan ke
btn.setText()
dalam panggilanrunOnUiThread()
.sumber
runOnUiThread()
tidak perlu tetapi harus tidak berbahaya. Javadoc untuk metode itu mengatakan "Menjalankan tindakan yang ditentukan pada utas UI. Jika utas saat ini adalah utas UI, maka tindakan dijalankan segera. Jika utas saat ini bukan utas UI, tindakan diposting ke antrian acara dari utas UI. "sumber
Ada beberapa teknik penggunaan runOnUiThread (), mari kita lihat semua
Ini adalah utas utama saya (utas UI) yang disebut AndroidBasicThreadActivity dan saya akan memperbaruinya dari utas pekerja dengan berbagai cara -
1.) Dengan melewatkan instance Activity sebagai argumen pada utas pekerja
2.) Dengan menggunakan metode View's post (Runnable runnable) di thread pekerja
3.) Dengan menggunakan kelas Handler dari paket android.os Jika kita tidak memiliki konteks (this / getApplicationContext ()) atau instance Activity (AndroidBasicThreadActivity.this) maka kita harus menggunakan kelas Handler seperti di bawah ini -
sumber
Jika menggunakan dalam fragmen maka cukup tulis
sumber
ini kamu:
sumber
Kami menggunakan Worker Thread untuk membuat Aplikasi lebih lancar dan menghindari ANR. Kita mungkin perlu memperbarui UI setelah proses yang berat dalam tapak pekerja. UI hanya dapat diperbarui dari Thread UI. Dalam kasus seperti itu, kami menggunakan Handler atau runOnUiThread keduanya memiliki metode runnable run yang dijalankan di UI Thread. Metode onClick berjalan di utas UI jadi tidak perlu menggunakan runOnUiThread di sini.
Menggunakan Kotlin
Saat dalam Aktivitas,
Dari Fragment,
Menggunakan Java ,
sumber
Anda dapat menggunakan dari sampel ini:
Dalam contoh berikut, kami akan menggunakan fasilitas ini untuk menerbitkan hasil dari pencarian sinonim yang diproses oleh utas latar.
Untuk mencapai tujuan selama callback aktivitas OnCreate, kami akan mengatur onClickListener untuk menjalankan searchTask pada utas yang dibuat.
Ketika pengguna mengklik tombol Cari, kami akan membuat kelas anonim Runnable yang mencari kata yang diketik dalam R.id.wordEt EditText dan memulai utas untuk menjalankan Runnable.
Ketika pencarian selesai, kami akan membuat turunan Runnable SetSynonymResult untuk menerbitkan hasilnya kembali pada TextView sinonim melalui utas UI.
Teknik ini kadang-kadang bukan yang paling nyaman, terutama ketika kita tidak memiliki akses ke instance Activity; oleh karena itu, dalam bab-bab berikut, kita akan membahas teknik yang lebih sederhana dan lebih bersih untuk memperbarui UI dari tugas komputasi latar belakang.
Sumber :
pemrograman android asinkron Helder Vasconcelos
sumber
Ini adalah bagaimana saya menggunakannya:
sumber
sumber
Coba ini:
getActivity().runOnUiThread(new Runnable...
Ini karena:
1) yang tersirat ini dalam panggilan Anda untuk menjalankanOnUiThread merujuk ke AsyncTask , bukan fragmen Anda.
2) Fragmen tidak memiliki runOnUiThread.
Namun, Aktivitas tidak.
Perhatikan bahwa Activity baru saja mengeksekusi Runnable jika Anda sudah berada di utas utama, jika tidak maka akan menggunakan Handler. Anda dapat menerapkan Handler dalam fragmen Anda jika Anda tidak ingin khawatir tentang konteksnya, sebenarnya sangat mudah:
// Contoh kelas
// di tempat lain dalam kode Anda
// ^ ini akan selalu dijalankan pada putaran berikutnya di utas utama.
sumber