Saya punya dua kelas ini. Aktivitas utama saya dan aktivitas yang memperpanjang AsyncTask
, Sekarang dalam Aktivitas utama saya, saya perlu mendapatkan hasil dari OnPostExecute()
dalam AsyncTask
. Bagaimana saya bisa meneruskan atau mendapatkan hasilnya ke Aktivitas utama saya?
Berikut adalah contoh kode.
Aktivitas utama saya.
public class MainActivity extends Activity{
AasyncTask asyncTask = new AasyncTask();
@Override
public void onCreate(Bundle aBundle) {
super.onCreate(aBundle);
//Calling the AsyncTask class to start to execute.
asyncTask.execute(a.targetServer);
//Creating a TextView.
TextView displayUI = asyncTask.dataDisplay;
displayUI = new TextView(this);
this.setContentView(tTextView);
}
}
Ini adalah kelas AsyncTask
public class AasyncTask extends AsyncTask<String, Void, String> {
TextView dataDisplay; //store the data
String soapAction = "http://sample.com"; //SOAPAction header line.
String targetServer = "https://sampletargeturl.com"; //Target Server.
//SOAP Request.
String soapRequest = "<sample XML request>";
@Override
protected String doInBackground(String... string) {
String responseStorage = null; //storage of the response
try {
//Uses URL and HttpURLConnection for server connection.
URL targetURL = new URL(targetServer);
HttpURLConnection httpCon = (HttpURLConnection) targetURL.openConnection();
httpCon.setDoOutput(true);
httpCon.setDoInput(true);
httpCon.setUseCaches(false);
httpCon.setChunkedStreamingMode(0);
//properties of SOAPAction header
httpCon.addRequestProperty("SOAPAction", soapAction);
httpCon.addRequestProperty("Content-Type", "text/xml; charset=utf-8");
httpCon.addRequestProperty("Content-Length", "" + soapRequest.length());
httpCon.setRequestMethod(HttpPost.METHOD_NAME);
//sending request to the server.
OutputStream outputStream = httpCon.getOutputStream();
Writer writer = new OutputStreamWriter(outputStream);
writer.write(soapRequest);
writer.flush();
writer.close();
//getting the response from the server
InputStream inputStream = httpCon.getInputStream();
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
ByteArrayBuffer byteArrayBuffer = new ByteArrayBuffer(50);
int intResponse = httpCon.getResponseCode();
while ((intResponse = bufferedReader.read()) != -1) {
byteArrayBuffer.append(intResponse);
}
responseStorage = new String(byteArrayBuffer.toByteArray());
} catch (Exception aException) {
responseStorage = aException.getMessage();
}
return responseStorage;
}
protected void onPostExecute(String result) {
aTextView.setText(result);
}
}
android
android-asynctask
Stella
sumber
sumber
Jawaban:
Mudah:
Buat
interface
kelas, di manaString output
opsional, atau dapat berupa variabel apa pun yang ingin Anda kembalikan.Buka
AsyncTask
kelas Anda , dan nyatakan antarmukaAsyncResponse
sebagai bidang:Dalam Aktivitas utama Anda, Anda perlu
implements
antarmukaAsyncResponse
.MEMPERBARUI
Saya tidak tahu ini adalah favorit bagi banyak dari Anda. Jadi, inilah cara sederhana dan nyaman untuk digunakan
interface
.masih menggunakan yang sama
interface
. FYI, Anda dapat menggabungkan ini ke dalamAsyncTask
kelas.di
AsyncTask
kelas:lakukan ini di
Activity
kelasmuAtau, mengimplementasikan antarmuka pada Kegiatan lagi
Seperti yang Anda lihat 2 solusi di atas, yang pertama dan ketiga, perlu membuat metode
processFinish
, yang lain, metode ini di dalam parameter pemanggil. Yang ketiga lebih rapi karena tidak ada kelas anonim bersarang. Semoga ini membantuTip : Ubah
String output
,,String response
danString result
ke berbagai jenis pencocokan untuk mendapatkan objek yang berbeda.sumber
Ada beberapa opsi:
Tempatkan
AsyncTask
kelas dalamActivity
kelas Anda . Dengan asumsi Anda tidak menggunakan tugas yang sama dalam banyak kegiatan, ini adalah cara termudah. Semua kode Anda tetap sama, Anda hanya memindahkan kelas tugas yang ada menjadi kelas bersarang di dalam kelas aktivitas Anda.Buat konstruktor khusus untuk Anda
AsyncTask
yang mengambil referensi untuk AndaActivity
. Anda akan instantiate tugas dengan sesuatu sepertinew MyAsyncTask(this).execute(param1, param2)
.sumber
static
? Gunakan sajafieldOrMethod
dariMyActivity
atauMyActivity.this.fieldOrMethod
jika dibayangi.MyAsyncTask
adalah bukan kelas batin.private
/protected
untuk kelas tingkat atas tidak diperbolehkan, maka saya pikir itu harusstatic
kelas non- batin.Saya merasa pendekatan di bawah ini sangat mudah.
Saya telah mendeklarasikan antarmuka untuk panggilan balik
Kemudian dibuat Tugas tidak sinkron untuk menanggapi semua jenis permintaan paralel
Kemudian Memanggil tugas asinkron saat mengklik tombol di kelas Aktivitas.
Terima kasih
sumber
Anda dapat mencoba kode ini di kelas Utama Anda. Itu bekerja untuk saya, tetapi saya telah menerapkan metode dengan cara lain
sumber
execute()
, lihat jawaban saya, saya sudah menambahkan komentar di sana. Anda mungkin ingin memeriksa jawaban saya yang diperbarui. semoga ini membantu.Jawaban ini mungkin terlambat tetapi saya ingin menyebutkan beberapa hal ketika Anda
Activity
bergantung padaAsyncTask
. Itu akan membantu Anda dalam mencegah crash dan manajemen memori. Seperti yang sudah disebutkan dalam jawaban di atasinterface
, kami juga mengatakan mereka dipanggil kembali. Mereka akan bekerja sebagai informan, tetapi tidak pernah mengirim referensi kuatActivity
atauinterface
selalu menggunakan referensi lemah dalam kasus-kasus tersebut.Lihat screenshot di bawah ini untuk mengetahui bagaimana hal itu dapat menyebabkan masalah.
Seperti yang Anda lihat jika kami mulai
AsyncTask
dengan referensi yang kuat maka tidak ada jaminan bahwa kamiActivity
/Fragment
akan hidup sampai kami mendapatkan data, jadi akan lebih baik untuk digunakanWeakReference
dalam kasus-kasus itu dan itu juga akan membantu dalam manajemen memori karena kami tidak akan pernah memegang referensi yang kuat dari kamiActivity
maka itu akan memenuhi syarat untuk pengumpulan sampah setelah distorsi.Periksa cuplikan kode di bawah ini untuk mengetahui cara menggunakan WeakReference yang luar biasa -
MyTaskInformer.java
Antarmuka yang akan berfungsi sebagai informan.MySmallAsyncTask.java
AsyncTask untuk melakukan tugas jangka panjang, yang akan digunakanWeakReference
.MainActivity.java
Kelas ini digunakan untuk memulaiAsyncTask
implementasikuinterface
pada kelasoverride
ini dan metode wajib ini.sumber
di Oncreate Anda ():
`
} `
sumber
Anda dapat melakukannya dalam beberapa baris, cukup timpa onPostExecute saat Anda memanggil AsyncTask Anda. Ini adalah contoh untuk Anda:
Saya harap ini membantu Anda, selamat membuat kode :)
sumber
onPostExecute
metode.Mengapa orang membuatnya begitu sulit.
Ini harus cukup.
Jangan mengimplementasikan onPostExecute pada tugas async, melainkan menerapkannya pada Activity:
sumber
@Override
?Anda dapat memanggil
get()
metodeAsyncTask
(atau kelebihan bebanget(long, TimeUnit)
). Metode ini akan memblokir sampaiAsyncTask
selesai pekerjaannya, pada titik mana ia akan mengembalikan AndaResult
.Adalah bijaksana untuk melakukan pekerjaan lain antara penciptaan / mulai tugas async Anda dan memanggil
get
metode, jika tidak, Anda tidak memanfaatkan tugas async dengan sangat efisien.sumber
Anda dapat menulis pendengar Anda sendiri. Ini sama dengan jawaban HelmiB tetapi terlihat lebih alami:
Buat antarmuka pendengar:
Kemudian tulis tugas asinkron Anda:
Akhirnya terapkan pendengar dalam aktivitas:
Dan ini adalah bagaimana Anda dapat memanggil asyncTask:
sumber
Hai, Anda dapat membuat sesuatu seperti ini:
Buat kelas yang mengimplementasikan AsyncTask
Tambahkan dalam Kegiatan Utama
sumber
Buat anggota statis di kelas Aktivitas Anda. Kemudian tetapkan nilai selama
onPostExecute
Misalnya, jika hasil AsyncTask Anda adalah sebuah String, buat string statis publik di Aktivitas Anda
public static String dataFromAsyncTask;
Kemudian, di
onPostExecute
AsyncTask, cukup buat panggilan statis ke kelas utama Anda dan atur nilainya.MainActivity.dataFromAsyncTask = "result blah";
sumber
Saya membuatnya bekerja dengan menggunakan threading dan penangan / pesan. Langkah-langkahnya sebagai berikut: Nyatakan Dialog kemajuan
Buat fungsi untuk menutup dialog saat operasi selesai.
Kode detail Eksekusi Anda:
sumber
Anda perlu menggunakan "protokol" untuk mendelegasikan atau menyediakan data ke Internet
AsynTask
.Delegasi dan Sumber Data
Delegasi adalah objek yang bertindak atas nama, atau berkoordinasi dengan, objek lain ketika objek itu berhadapan dengan suatu peristiwa dalam suatu program. ( Definisi Apple )
protokol adalah antarmuka yang mendefinisikan beberapa metode untuk mendelegasikan beberapa perilaku.
Ini contoh lengkapnya !!!
sumber
coba ini:
Dan contoh penggunaan:
sumber
Mungkin sedikit berlebihan tetapi saya memberikan panggilan balik untuk kedua kode eksekusi dan hasilnya. jelas untuk keamanan utas Anda ingin berhati-hati dengan apa yang Anda akses di callback eksekusi Anda.
Implementasi AsyncTask:
Panggilan balik:
Dan akhirnya pelaksanaan tugas async:
sumber
Semoga Anda sudah melalui ini , jika tidak silakan baca.
https://developer.android.com/reference/android/os/AsyncTask
Bergantung pada sifat data hasil, Anda harus memilih opsi terbaik yang dapat Anda pikirkan.
Ini adalah pilihan yang bagus untuk menggunakan Interface
beberapa opsi lain akan menjadi ..
Jika kelas AsyncTask didefinisikan di dalam kelas yang Anda ingin gunakan hasilnya. Gunakan variabel global statis atau get () , gunakan dari kelas luar ( variabel volatil jika perlu). tetapi harus menyadari kemajuan AsyncTask atau setidaknya harus memastikan bahwa ia telah menyelesaikan tugas dan hasilnya tersedia melalui metode variabel global / get (). Anda dapat menggunakan polling, onProgressUpdate (Progress ...) , sinkronisasi atau antarmuka (Yang paling cocok untuk Anda)
Jika Hasil tersebut kompatibel untuk menjadi entri sharedPreference atau tidak apa-apa untuk disimpan sebagai file dalam memori Anda bisa menyimpannya bahkan dari tugas latar belakang itu sendiri dan bisa menggunakan onPostExecute () metode
untuk mendapatkan diberitahu ketika hasilnya tersedia di Ingatan.
Jika string cukup kecil, dan akan digunakan dengan dimulainya suatu kegiatan. adalah mungkin untuk menggunakan maksud ( putExtra () ) dalam onPostExecute () , tapi ingat bahwa konteks statis tidak aman untuk menangani.
Jika memungkinkan, Anda dapat memanggil metode statis dari metode onPostExecute (), dan hasilnya adalah parameter Anda
sumber