通常、AsyncTask
同じアクティビティでのみ使用されることをより明確にするために、同じクラスに配置します。
AsyncTask
それを複数のアクティビティで再利用したい場合は、独立したクラスを作成し、コンストラクターによってアクティビティからパラメーターを渡すだけです。
以下のように AsyncTask からアクティビティに応答を送信し、必要に応じてリスナー メソッドを呼び出すために、AsyncTask にインターフェイスを作成できます。私はそれを呼んだ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);
}
}
}
Your Activity クラスでは、そのリスナーを実装し、その実装メソッドで textview を更新するコードを記述する必要があります。
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);
}
};
}
また、以下のコードを記述して、ボタン クリック イベントなどの必要なときにいつでもアクティビティで AsyncTask を開始できます。
DeckDownloader mTask = new DeckDownloader(this.getApplicationContext(), downloadListener);
mTask.execute();
これはあなたが望むものです!