編集:
すみません、誤解していたようです。次のコードを見てください。これは Chinaski のコード (コールバック メソッドにインターフェイスを使用するだけ) に似ていますが、メモリ リークを回避する方法でコードを使用する方法を理解できるように、もう少し追加しました。
onDestroy 中にアクティビティがどのようにデタッチされるかに注意してください。代わりに、WeakReference を使用することもできますが、最近では Fragment を使用しsetRetainInstance(true)
、フラグメントが保持されるため、デタッチ/アタッチを完全に回避します。
MyAsyncTask
public class MyAsyncTask extends AsyncTask<Void, Void, Void> {
private Callback mCallback;
private boolean mIsComplete = false;
private boolean mHasCallbackBeenCalled = false;
public MyBackgroundTask(Callback callback) {
mCallback = callback;
}
/** Only safe to call this from the UI thread */
public void attach(Callback callback) {
mCallback = callback;
if (mIsComplete && !mHasCallbackBeenCalled) {
fireCallback();
}
}
/** Only safe to call this from the UI thread */
public void detach() {
mCallback = callback;
}
@Override
public void doInBackground() {
// do the heavy stuff here
return null;
}
@Override
public void onPostExecute(Void result) {
mIsComplete = true;
fireCallback();
}
private void fireCallback() {
if (mCallback != null) {
mCallback.callbackMethod();
mHasCallbackBeenCalled = true;
}
}
public static interface Callback {
public void callbackMethod();
}
}
マイアクティビティ
public class MyActivity extends Activity implements MyAsyncTask.Callback {
private MyAsyncTask mTask;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// Check for a retained task after a configuration change
// e.g. a rotation
if (getLastNonConfigurationInstance() != null) {
mTask = (MyAsyncTask) getLastNonConfigurationInstance();
// Re-attach the task
mTask.attach(this);
}
}
@Override
public void onDestroy() {
// Detach from task to avoid memory leak
if (mTask != null) {
mTask.detach();
}
super.onDestroy();
}
@Override
public Object onRetainNonConfigurationInstance() {
// Retain the async task duration a rotation
return mTask;
}
/** Callback method */
@Override
public void callbackMethod() {
// Do something here
}
}