Mai mult
AsyncTask Android exemplu
Am citit despre AsyncTask
, și am încercat program simplu de mai jos. Dar aceasta nu pare să funcționeze. Cum pot face să funcționeze?
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) {
}
}
}
Eu sunt doar încercarea de a schimba eticheta după 5 secunde în procesul de fond.
Acest lucru este meu main.xml:
<?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>
665
19
Meu răspuns complet este aici, dar aici este o imagine de motive pentru a suplimenta alte răspunsuri pe această pagină. Pentru mine, înțelegerea în cazul în care toate variabilele au fost partea cea mai confuz la început.
Ok sunteți încercarea de a accesa GUI printr-un alt fir. Aceasta, în principal, nu este o bună practică.
La AsyncTask execută tot în
doInBackground()
în interiorul unui alt fir, care nu au acces la GUI în cazul în care opiniile dumneavoastră sunt.preExecute () " și " postExecute()
vă oferă acces la GUI înainte și după ridicarea grele apare în acest nou fir, puteți trece chiar și rezultatul din operațiuni de lungă pentru apostExecute()
apoi afișa rezultate din prelucrare.A se vedea aceste linii în cazul în care sunteți mai târziu actualizarea TextView:
le-a pus într
onPostExecute()
Veți vedea apoi TextView text actualizat după
doInBackground
completeaza.EDIT: am observat că onClick ascultător nu a verifica pentru a vedea ce punct de Vedere a fost selectat. Am găsit cel mai simplu mod de a face acest lucru este prin intermediul unui comutator declarații. Am o completați clasa editate de mai jos cu toate sugestiile pentru a salva confuzie.
Am'sunt sigur că acesta este de executare în mod corespunzător, dar're încercarea de a schimba elemente de UI în fir de fundal și că a câștigat't face.
Revizuirea apel și AsyncTask, după cum urmează:
De Asteptare Clasa
Notă: personal, am sugerăm să utilizați
onPostExecute()
oriunde te executa AsyncTask fir și nu în clasa care extinde AsyncTask în sine. Cred că asta face codul mai ușor de citit, mai ales dacă ai nevoie de AsyncTask în mai multe locuri de manipulare cele rezultate ușor diferite.LongThread clasa (se extinde AsyncTask):
Am creat un simplu exemplu pentru utilizarea AsyncTask de Android. Acesta începe cu
onPreExecute(), doInBackground(), publishProgress()
și în cele din urmăonProgressUpdate()
.În acest doInBackground() funcționează ca un fir de fundal, în timp ce alte lucrări în Firul UI. Puteți't a accesa un element de UI în doInBackground(). Secvența este aceeași ca le-am menționat.
Cu toate acestea, dacă aveți nevoie pentru a actualiza orice widget din
doInBackground
potipublishProgress "de la" doInBackground
care va suna onProgressUpdate să actualizați UI widget.Muta aceste două linii:
din AsyncTask's
doInBackground
metoda și le-a pus înonPostExecute
metoda. TaAsyncTask
ar trebui să arate ceva de genul asta:Fundal / Teoria
AsyncTask vă permite să rulați o sarcină pe un fir de fundal, în timp ce publicarea rezultatelor la firul UI.
Punerea în aplicare
AsyncTask este o clasă generică. (Este nevoie de tipuri parametrizate în constructor.)
Se folosește de aceste trei tipuri generice:
Params
- tipul de parametrii trimis la sarcina la executare."Progres" - tipul de progresul unități publicate în fundal de calcul.
"Rezultat" - tipul de rezultatul de fundal de calcul.
Acești trei parametri corespund trei funcții principale puteți suprascrie în
AsyncTask
:doInBackground(Params...)
onProgressUpdate(Progress...)
onPostExecute(Rezultat)
Pentru a executa AsyncTask
execute()
cu parametrii pentru a fi trimis la sarcină de fundal.Ce Se Întâmplă
onPreExecute()
este numit.doInBackground(Params...)
este numit.(
Params
au trecut prin "execute".)Unde lungă durată, sarcina ar trebui să se întâmple.
Trebuie să suprascrie cel puțin
doInBackground()
pentru a utiliza AsyncTask.Apel
publishProgress(Progress...)
pentru a actualiza interfața cu utilizatorul cu un display de progres (de exemplu, UI animație sau log text tipărit), în timp ce fondul de calcul este încă de executare.onProgressUpdate()
să fie numit.onPostExecute()
este numit cu rezultatul întors.Exemple
În ambele exemple "blocarea sarcina" este o descărcare de pe web.
Un Exemplu
Anii
doInBackground()
metoda popularitate imaginea și o stochează într-un obiect de tip BitMap. AniionPostExecute()
metoda ia bitmap și locuri în ImageView.Exemplu B
Exemplu B executie
Atunci când o sarcină asincron este executat, sarcina trece prin 4 etape:
Mai jos este un exemplu demo
și odată ce ai creat, o sarcină este executat foarte simplu:
Sper acest lucru vă va ajuta...
Mai scurt exemplu pentru a face ceva în mod asincron:
Să-l rulați:
Cum de a memora parametrii utilizați în AsyncTask?
Dacă sunteți nou la AsyncTask atunci este foarte frecvente pentru a obține confuz în timp ce scrieți un AsyncTask. Principalii vinovați sunt parametrii utilizați în AsyncTask ie
AsyncTask<a,B,C>
. Pe baza a,B,C (argumente) semnătura metodele diferă, ceea ce face treaba chiar mai confuze.Păstrați-l simplu!
Cheia este de Don't memorează. Dacă poți să vizualizezi ce sarcina dumneavoastră într-adevăr nevoie pentru a face atunci scrie AsyncTask cu semnătura corectă la prima încercare ar fi o bucată de tort. Doar dau seama ce dvs. de Intrare, de Progres și de Ieșire și veți fi bine să plec.
Deci, ce este un AsyncTask?
AsyncTask sunt sarcină de fundal care rula în fundal fir. Este nevoie de un Introducere, efectuează Progresul și dă Ieșire.
De exemplu:
Ce este relația cu metode ?
Cum să scrie asta in codul?
Cum va executa această Sarcină?
Atunci când sunt în fir de lucrător, nu se poate manipula direct de elemente de UI pe Android.
Atunci când utilizați AsyncTask vă rugăm să înțelegeți metode callback.
De exemplu:
FYI: Pentru a accesa UI fir de la un lucrător fir, puteți utiliza fie runOnUiThread() metoda a sau metoda post pe punctul dumneavoastră de vedere.
De exemplu:
Acest lucru vă va ajuta să știți lucrurile mai bine. Prin urmare, în caz, aveți nevoie pentru a seta textview în onPostExecute() metodă.
Mi-ar recomanda de a face viața mai ușoară de a utiliza această bibliotecă pentru fundal funcționează https://github.com/Arasthel/AsyncJobLibrary
acest simplu..
Proba Asincron Sarcina cu cerere POST:
Pur și simplu:
Ai nevoie de a declara butonul onclicklistener, odată ce faceți clic pe se solicită clasa AsyncTask DownloadJson ,procesul va fi prezentat mai jos:
În timp ce lucrează cu AsyncTask, este necesar să se creeze o clasă-succesor și în ea pentru a înregistra implementarea de metode necesare pentru noi. În această lecție ne vom uita la trei metode:
doInBackground - va fi executat într-un nou thread, aici vom rezolva toate sarcinile dificile. Deoarece non-fir primar - nu are acces la UI.
onPreExecute - a executat înainte de doInBackground, are acces la UI
onPostExecute - executate după doInBackground (nu funcționează dacă AsyncTask a fost anulat - despre acest lucru în următorul lecții), are acces la UI
Acest MyAsyncTask clasa
}
Și acest lucru este cum de a apela în Activitate sau Fragment
Proba AsyncTask exemplu cu progresul
Asincron Sarcina;
Schimba codul de mai jos: