/ / Android Multi-Threading, hlavné vlákno nie je dostupné z Asynctask - java, Android, multithreading, android-asynctask

Android Multi-Threading, hlavná téma nie je prístupná z Asynctask - java, android, multithreading, android-asynctask

Táto otázka sa možno už predtým pýtala, ale nemohla som ju nájsť pri mojich vyhľadávaniach.

Vo svojom androide som implementoval aktivituaplikácie a tiež som použil triedu Asynctask v tejto aktivite. Pokúsil som sa urobiť nejaké zmeny na mojom rozložení z Asynctask (doInBackgroung), z tohto dôvodu som nazval runOnUiThread zo spomenutého Asynctask. Funguje to správne, ale akonáhle sa presuniem k inej aktivite a znova sa k tejto aktivite vrátim, zmeny v rozložení už nebudú prebiehať.

Stojí za zmienku, že som volal asynctask.cancel(true) pri prechode na ďalšiu aktivitu a znovu zostaviť asyntask, keď sa vrátite späť k tejto aktivite, ktorá obsahuje uvedený asynctask.

Sprievodca, ako vyriešiť tento problém.

odpovede:

0 pre odpoveď č. 1

Je ťažké povedať bez toho, aby ste sa pozreli na svoj kód, ale navrhujem, aby ste nezavolali runOnUiThread() vo vašom asyncTask. Namiesto toho vytvorte rozhranie vo vnútri triedy AsyncTask a pri vytváraní triedy AsyncTask odovzdajte svoju aktivitu, ktorá implementuje toto rozhranie. Potom vo vnútri onPostExecute() skontrolujte, či váš poslucháč (napr. aktivita, ktorá implementuje vaše rozhranie) nie je null a zavolajte metódu na tomto rozhraní - táto sa potom spracuje vo vnútri implementovanej metódy v rámci aktivity, na správnom vlákne, kde môžete tiež skontrolovať, či máte stále správne prvky používateľského rozhrania alebo nájsť podľa potreby pomocou id.

public class MyActivity extends Activity implements OnAsyncFinishedListener {

<... activity stuff ...>

@Override
public void onAsyncFinished() {
// do stuff with your activity ui
}
}

public class MyAsyncTask extends AsyncTask<Void, Void, Void> {
private OnAsyncFinishedListener mListener;

public static interface OnAsyncFinishedListener {
void onAsyncFinished();
}

public MyAsyncTask(OnAsyncFinishedListener listener) {
mListener = listener
}

<... async task stuff ...>

@Override
protected void onPostExecute(Void void) {
if (mListener != null) {
mListener.onAsyncFinished();
}
}
}