편집 :
죄송합니다. 다음 코드를 살펴보십시오. Chinaski 's (콜백 메소드 용 인터페이스를 사용하는 것과 비슷합니다)와 비슷하지만 메모리 누수를 피할 수있는 방법으로 사용하는 방법을 알기 위해 조금 더 추가했습니다.
onDestroy에서 활동을 분리하는 방법에 유의하십시오. WeakReference를 사용할 수도 있지만 요즘은 setRetainInstance(true)
인 Fragment를 사용하고 조각이 유지 될 때 분리/부착을 완전히 피할 수 있습니다.
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();
}
}
MyActivity
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
}
}
하면 AsyncTask를 내부 처리기를 사용한다. –