Nói chung chúng tôi đặt AsyncTask
trong cùng một lớp để làm rõ hơn là chỉ được sử dụng bởi cùng một hoạt động.
Nếu bạn muốn điều đó AsyncTask
tobe tái sử dụng bởi nhiều hơn một hoạt động hơn, bạn chỉ có thể tạo ra một lớp độc lập và vượt qua các thông số từ hoạt động của nhà thầu
Bạn có thể tạo giao diện trong AsyncTask của bạn để gửi phản hồi từ AsyncTask để hoạt động của bạn như dưới đây và gọi cho bạn phương pháp lister bất cứ khi nào cần thiết.Tôi đã gọi nó là 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);
}
}
}
Và trong lớp học Hoạt động của bạn, bạn cần phải thực hiện nghe điều đó và viết mã của bạn để cập nhật TextView trong đó phương pháp thực hiện:
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);
}
};
}
Và bạn có thể viết mã dưới đây để bắt đầu AsyncTask trong hoạt động của bạn bất cứ khi nào được yêu cầu như sự kiện nhấp vào nút hoặc người nào khác
DeckDownloader mTask = new DeckDownloader(this.getApplicationContext(), downloadListener);
mTask.execute();
Đây có thể là thứ bạn muốn!
Nguồn
2013-03-14 13:05:00
tại sao bạn muốn gọi runOnUIThread từ AsyncTask? – EvilDuck
để thay đổi TextViews, chúng không thể thay đổi từ các chủ đề khác. – Alex
Bạn có thể cập nhật giao diện người dùng trong onPostExecute và onPreExecute –