Saya membaca tentang AsyncTask
, dan saya mencoba program sederhana di bawah ini. Tapi sepertinya itu tidak berhasil. Bagaimana saya bisa membuatnya bekerja?
public class AsyncTaskActivity extends Activity {
Button btn;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
btn = (Button) findViewById(R.id.button1);
btn.setOnClickListener((OnClickListener) this);
}
public void onClick(View view){
new LongOperation().execute("");
}
private class LongOperation extends AsyncTask<String, Void, String> {
@Override
protected String doInBackground(String... params) {
for(int i=0;i<5;i++) {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
TextView txt = (TextView) findViewById(R.id.output);
txt.setText("Executed");
return null;
}
@Override
protected void onPostExecute(String result) {
}
@Override
protected void onPreExecute() {
}
@Override
protected void onProgressUpdate(Void... values) {
}
}
}
Saya hanya mencoba mengubah label setelah 5 detik dalam proses latar belakang.
Ini main.xml saya :
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >
<ProgressBar
android:id="@+id/progressBar"
style="?android:attr/progressBarStyleHorizontal"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:indeterminate="false"
android:max="10"
android:padding="10dip">
</ProgressBar>
<Button
android:id="@+id/button1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Start Progress" >
</Button>
<TextView android:id="@+id/output"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Replace"/>
</LinearLayout>
android
android-asynctask
Rubah
sumber
sumber
Jawaban:
Oke, Anda mencoba mengakses GUI melalui utas lainnya. Ini, pada dasarnya, bukan praktik yang baik.
AsyncTask mengeksekusi semua yang ada di
doInBackground()
dalam utas lainnya, yang tidak memiliki akses ke GUI di mana pandangan Anda berada.preExecute()
danpostExecute()
menawarkan Anda akses ke GUI sebelum dan sesudah pengangkatan berat terjadi di utas baru ini, dan Anda bahkan dapat melewati hasil operasi panjangpostExecute()
untuk kemudian menunjukkan hasil pemrosesan.Lihat baris ini di mana Anda nanti memperbarui TextView Anda:
Masukkan mereka
onPostExecute()
.Anda kemudian akan melihat teks TextView Anda diperbarui setelah
doInBackground
selesai.Saya perhatikan bahwa pendengar onClick Anda tidak memeriksa untuk melihat Tampilan mana yang telah dipilih. Saya menemukan cara termudah untuk melakukan ini adalah melalui pernyataan switch. Saya memiliki kelas lengkap yang diedit di bawah ini dengan semua saran untuk menyimpan kebingungan.
sumber
onPostExecute(String result)
metode ini. Ini akan memperjelas bagi pembaca masa depan bahwa argumen diisi oleh nilai balik daridoInBackground(String... params)
.Jawaban lengkap saya ada di sini , tetapi di sini ada gambar penjelasan untuk melengkapi jawaban lain pada halaman ini. Bagi saya, memahami kemana semua variabel pergi adalah bagian yang paling membingungkan di awal.
sumber
params
adalah sebuah array. (Dalam contoh di atas, itu adalah sebuahString
array.) Ini memungkinkan Anda untuk memasukkan beberapa parameter dari jenis yang sama. Kemudian Anda dapat mengakses parameter denganparams[0]
,params[1]
,params[2]
, dll Dalam contoh ini, hanya ada satuString
diparams
berbagai. Jika Anda perlu memasukkan beberapa parameter dari jenis yang berbeda (misalnya, aString
dan anint
), lihat pertanyaan ini .Saya yakin ini dijalankan dengan benar, tetapi Anda mencoba mengubah elemen UI di utas latar dan itu tidak akan berhasil.
Revisi panggilan Anda dan AsyncTask sebagai berikut:
Kelas Panggilan
Catatan: Saya pribadi menyarankan untuk menggunakan di
onPostExecute()
mana pun Anda mengeksekusi utas AsyncTask Anda dan tidak di kelas yang memperluas AsyncTask itu sendiri. Saya pikir itu membuat kode lebih mudah dibaca terutama jika Anda memerlukan AsyncTask di beberapa tempat yang menangani hasil yang sedikit berbeda.Kelas LongThread (meluas AsyncTask):
sumber
onPostExecute
dalam kegiatan ini brilian.Saya telah membuat contoh sederhana untuk menggunakan AsyncTask dari Android. Dimulai dengan
onPreExecute(), doInBackground(), publishProgress()
dan akhirnyaonProgressUpdate()
.Dalam hal ini, doInBackground () berfungsi sebagai utas latar, sedangkan karya lainnya di Utas UI. Anda tidak dapat mengakses elemen UI di doInBackground (). Urutannya sama dengan yang saya sebutkan.
Namun, jika Anda perlu memperbarui widget dari
doInBackground
, Anda dapatpublishProgress
daridoInBackground
yang akan memanggilonProgressUpdate
untuk memperbarui widget UI Anda.Sebut saja seperti ini di aktivitas Anda:
Referensi Pengembang Di Sini
sumber
Pindahkan dua baris ini:
keluar dari
doInBackground
metode AsyncTask Anda dan memasukkannya ke dalamonPostExecute
metode tersebut. AndaAsyncTask
akan terlihat seperti ini:sumber
AsyncTask
, yang saya jawab alamatnya; dan mengirimkan nilai dari layanan ke utas ui, yang dibahas oleh diskusi lainnya. Masalah-masalah ini independen.Latar Belakang / Teori
AsyncTask memungkinkan Anda untuk menjalankan tugas pada utas latar belakang, saat menerbitkan hasil ke utas UI.
Penerapan
AsyncTask adalah kelas generik. (Dibutuhkan tipe parameter dalam konstruktornya.)
Ini menggunakan tiga jenis generik ini:
Params
- jenis parameter yang dikirim ke tugas setelah eksekusi.Progress
- jenis unit kemajuan yang diterbitkan selama perhitungan latar belakang.Result
- jenis hasil perhitungan latar belakang.Tiga parameter ini sesuai dengan tiga fungsi utama yang dapat Anda timpa
AsyncTask
:doInBackground(Params...)
onProgressUpdate(Progress...)
onPostExecute(Result)
Untuk menjalankan AsyncTask
execute()
dengan parameter untuk dikirim ke tugas latar belakang.Apa yang terjadi
Pada utas utama / UI ,
onPreExecute()
disebut.Di utas latar belakang ,
doInBackground(Params...)
disebut.Params
diteruskan melaluiexecute
.)Harus mengganti setidaknya
doInBackground()
untuk menggunakan AsyncTask.Panggilan
publishProgress(Progress...)
untuk memperbarui antarmuka pengguna dengan tampilan kemajuan (mis. Animasi UI atau teks log dicetak) saat perhitungan latar belakang masih dijalankan.onProgressUpdate()
untuk dipanggil.Di utas latar hasil dikembalikan
doInBackground()
.Pada utas utama / UI ,
onPostExecute()
dipanggil dengan hasil yang dikembalikan.Contohnya
Dalam kedua contoh, "tugas pemblokiran" adalah pengunduhan dari web.
Contoh A
The
doInBackground()
Metode download gambar dan menyimpannya dalam sebuah objek dari tipe bitmap. TheonPostExecute()
Metode mengambil bitmap dan menempatkannya di ImageView tersebut.Contoh B
Contoh B eksekusi
sumber
Saat tugas asinkron dijalankan, tugas melewati empat langkah:
Di bawah ini adalah contoh demo:
Dan begitu Anda membuat, tugas dijalankan dengan sangat sederhana:
sumber
Contoh terpendek untuk hanya melakukan sesuatu secara tidak sinkron:
Untuk menjalankannya:
sumber
Bagaimana cara menghafal parameter yang digunakan dalam AsyncTask?
Jika Anda baru mengenal AsyncTask, maka sangat umum untuk bingung saat menulis AsyncTask. Penyebab utama adalah parameter yang digunakan dalam AsyncTask, yaitu
AsyncTask<A, B, C>
,. Berdasarkan tanda tangan A, B, C (argumen) dari metode yang berbeda yang membuat segalanya lebih membingungkan.Tetap sederhana!
Kuncinya adalah jangan menghafal . Jika Anda dapat memvisualisasikan apa yang benar-benar perlu dilakukan oleh tugas Anda, maka tulis AsyncTask dengan tanda tangan yang benar pada upaya pertama adalah sepotong kue. Cari tahu apa yang Anda
Input
,Progress
danOutput
apa, dan Anda akan baik untuk pergi.Jadi apa itu AsyncTask?
AsyncTask adalah tugas latar belakang yang berjalan di utas latar belakang. Dibutuhkan
Input
, melakukanProgress
dan memberiOutput
.Sebagai contoh:
Apa hubungannya dengan metode?
Bagaimana cara menuliskannya dalam kode?
Bagaimana Anda menjalankan tugas ini?
sumber
Ketika Anda berada di utas pekerja, Anda tidak bisa secara langsung memanipulasi elemen UI di Android.
Saat Anda menggunakan AsyncTask, harap pahami metode panggilan balik.
Sebagai contoh:
FYI: Untuk mengakses utas UI dari utas pekerja, Anda dapat menggunakan metode runOnUiThread () atau memposting metode pada tampilan Anda.
Contohnya:
Ini akan membantu Anda mengetahui hal-hal dengan lebih baik. Karenanya dalam kasus Anda, Anda perlu mengatur tampilan teks Anda pada metode onPostExecute ().
sumber
Saya akan merekomendasikan membuat hidup Anda lebih mudah dengan menggunakan perpustakaan ini untuk pekerjaan latar belakang:
https://github.com/Arasthel/AsyncJobLibrary
Sesederhana ini ...
sumber
Contoh Tugas Async dengan permintaan POST:
sumber
Secara sederhana:
sumber
Anda perlu mendeklarasikan tombol onclicklistener. Setelah diklik, ia memanggil kelas AsyncTask DownloadJson.
Prosesnya akan ditunjukkan di bawah ini:
sumber
sumber
Pembaruan: Maret 2020
Menurut dokumentasi resmi pengembang Android , AsyncTask sekarang tidak digunakan lagi.
Dianjurkan untuk menggunakan korlin kotlin sebagai gantinya. Sederhananya, ini memungkinkan Anda untuk menulis tugas yang tidak sinkron dengan gaya berurutan.
sumber
Contoh AsyncTask contoh dengan progres
sumber
Tugas ASync;
sumber
MyTask
di dalam kelasMainActivity
? Apakah itu adat?Saat bekerja dengan AsyncTask, perlu untuk membuat kelas-penerus dan di dalamnya untuk mendaftarkan implementasi metode yang diperlukan bagi kita. Dalam pelajaran ini kita akan melihat tiga metode:
doInBackground - akan dieksekusi di utas baru, dan di sini kita menyelesaikan semua tugas sulit kita. Karena utas non-primer tidak memiliki akses ke UI.
onPreExecute - dieksekusi sebelum doInBackground dan memiliki akses ke UI
onPostExecute - dieksekusi setelah doInBackground (tidak berfungsi jika AsyncTask dibatalkan - tentang hal ini dalam pelajaran berikutnya) dan memiliki akses ke UI.
Ini adalah kelas MyAsyncTask:
Dan ini cara menelepon dalam Aktivitas atau Fragmen Anda:
sumber
jika Anda membuka kelas AsyncTask Anda dapat melihat kode di bawah ini.
Fitur AsyncTask
contoh
sumber
Ubah kode Anda seperti yang diberikan di bawah ini:
sumber