Ogólnie kładziemy AsyncTask
w tej samej klasie, aby uczynić go bardziej jasne, że jest on używany tylko przez taką samą działalność.
Jeśli chcesz, aby AsyncTask
Tobe ponownie wykorzystane przez więcej niż jednej czynności niż można po prostu stworzyć niezależną klasę i przekazać parametry z działalności przez konstruktorów
Można utworzyć interfejs w asyncTask wysłać odpowiedź z asynctask do twoja aktywność jak poniżej i wywołaj metodę lister, gdy jest to wymagane.Nazwałem go onPostExecute()
:
public class DeckDownloader extends AsyncTask<Void, Void, String> {
OnDownloadUpdateListener listener;
public interface OnDownloadUpdateListener {
public void OnDownloadDeckFinish(String Response);
}
public DeckDownloader(Context ctx, OnDownloadUpdateListener listener) {
mContext = ctx;
this.listener = listener;
}
@Override
protected String doInBackground(Void... params) {
String str = "downloading";
//your async code goes here
return str;
}
@Override
protected void onPreExecute() {
super.onPreExecute();
}
@Override
protected void onPostExecute(String result) {
if(listener != null) {
listener.OnDownloadDeckProgress(result);
}
}
}
A w klasie aktywny, trzeba wdrożyć tę słuchacza i napisać kod do aktualizacji TextView w tym sposobie realizacji:
public class myActivity extends Activity{
private DeckDownloader.OnDownloadUpdateListener downloadListener;
TextView txtAsyncResponse;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
txtAsyncResponse = (TextView) findViewById(R.id.txtAsyncResponse);
downloadListener = new DeckDownloader.OnDownloadUpdateListener() {
@Override
public void OnDownloadDeckFinish(String Response) {
txtAsyncResponse.setText(Response);
}
};
}
I można napisać poniżej kod aby rozpocząć AsyncTask w swojej działalności na każde żądanie jak przycisk kliknij zdarzenie lub inny
DeckDownloader mTask = new DeckDownloader(this.getApplicationContext(), downloadListener);
mTask.execute();
To może być thindg chcesz!
dlaczego chcesz wywołać runOnUIThread z AsyncTask? – EvilDuck
aby zmienić TextViews, nie można ich zmienić z innych wątków. – Alex
Możesz zaktualizować interfejs w onPostExecute i onPreExecute –