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ď č. 1Je ť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();
}
}
}