一般我々は、それが唯一の同じ活動で使用されていること、それをより明確にするために、同じクラスにAsyncTask
を配置します。
あなたはAsyncTask
戸部がより以上の活動により再利用することを望むならば、あなたは、単に独立したクラスを作成し、あなたがにasynctaskから応答を送信するために、あなたasyncTaskにインターフェイスを作成することができますコンストラクタ
での活動からパラメータを渡すことができますあなたの活動は以下のようになり、必要な時はいつでもリスターメソッドを呼び出します。
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);
}
};
}
そして、あなたは、コードの下に書くことができます。
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);
}
}
}
とあなたのActivityクラスでは、あなたがそのリスナーを実装し、その実装方法でのTextViewを更新するようにコードを記述する必要があります。私はonPostExecute()
それを求めていますあなたのアクティビティでAsyncTaskを開始するには、ボタンクリックイベントなどが必要です。
DeckDownloader mTask = new DeckDownloader(this.getApplicationContext(), downloadListener);
mTask.execute();
これはあなたが必要とするものです。
なぜAsyncTaskからrunOnUIThreadを呼び出すのですか?テキストビューを変更するには – EvilDuck
、他のスレッドからは変更できません。 – Alex
onPostExecuteとonPreExecuteでUIを更新できます –