나는 매니페스트 파일을 편집하지 않고이 딜레마에 대한 해결책을 찾기 위해 일주일 동안 노력했습니다. 이 솔루션의 가정은 다음과 같습니다.
- 항상 진행률 대화 상자를 사용해야합니다
- 한 번에 하나의 작업 만 수행
- 전화가 회전하고 진행률 대화 상자가 자동으로 닫힐 때 작업을 지속해야합니다.
이행
이 게시물의 하단에있는 두 파일을 작업 공간에 복사해야합니다. 다음을 확인하십시오.
당신 Activity의 모든 확장해야합니다BaseActivity
에서 onCreate()에 super.onCreate()액세스해야하는 멤버를 초기화 한 후에서을 (를) 호출해야합니다 ASyncTask. 또한 getContentViewId()양식 레이아웃 ID를 제공하도록 대체 하십시오.
활동에 의해 관리되는 대화 상자를 작성하려면 onCreateDialog() 평소처럼 무시 하십시오.
AsyncTasks를 만들기위한 정적 정적 내부 클래스 샘플은 아래 코드를 참조하십시오. mResult에 결과를 저장하여 나중에 액세스 할 수 있습니다.
final static class MyTask extends SuperAsyncTask<Void, Void, Void> {
public OpenDatabaseTask(BaseActivity activity) {
super(activity, MY_DIALOG_ID); // change your dialog ID here...
// and your dialog will be managed automatically!
}
@Override
protected Void doInBackground(Void... params) {
// your task code
return null;
}
@Override
public boolean onAfterExecute() {
// your after execute code
}
}
마지막으로 새 작업을 시작하십시오.
mCurrentTask = new MyTask(this);
((MyTask) mCurrentTask).execute();
그게 다야! 이 강력한 솔루션이 누군가를 도울 수 있기를 바랍니다.
BaseActivity.java (가져 오기 구성)
protected abstract int getContentViewId();
public abstract class BaseActivity extends Activity {
protected SuperAsyncTask<?, ?, ?> mCurrentTask;
public HashMap<Integer, Boolean> mDialogMap = new HashMap<Integer, Boolean>();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(getContentViewId());
mCurrentTask = (SuperAsyncTask<?, ?, ?>) getLastNonConfigurationInstance();
if (mCurrentTask != null) {
mCurrentTask.attach(this);
if (mDialogMap.get((Integer) mCurrentTask.dialogId) != null
&& mDialogMap.get((Integer) mCurrentTask.dialogId)) {
mCurrentTask.postExecution();
}
}
}
@Override
protected void onPrepareDialog(int id, Dialog dialog) {
super.onPrepareDialog(id, dialog);
mDialogMap.put(id, true);
}
@Override
public Object onRetainNonConfigurationInstance() {
if (mCurrentTask != null) {
mCurrentTask.detach();
if (mDialogMap.get((Integer) mCurrentTask.dialogId) != null
&& mDialogMap.get((Integer) mCurrentTask.dialogId)) {
return mCurrentTask;
}
}
return super.onRetainNonConfigurationInstance();
}
public void cleanupTask() {
if (mCurrentTask != null) {
mCurrentTask = null;
System.gc();
}
}
}
SuperAsyncTask.java
public abstract class SuperAsyncTask<Params, Progress, Result> extends AsyncTask<Params, Progress, Result> {
protected BaseActivity mActivity = null;
protected Result mResult;
public int dialogId = -1;
protected abstract void onAfterExecute();
public SuperAsyncTask(BaseActivity activity, int dialogId) {
super();
this.dialogId = dialogId;
attach(activity);
}
@Override
protected void onPreExecute() {
super.onPreExecute();
mActivity.showDialog(dialogId); // go polymorphism!
}
protected void onPostExecute(Result result) {
super.onPostExecute(result);
mResult = result;
if (mActivity != null &&
mActivity.mDialogMap.get((Integer) dialogId) != null
&& mActivity.mDialogMap.get((Integer) dialogId)) {
postExecution();
}
};
public void attach(BaseActivity activity) {
this.mActivity = activity;
}
public void detach() {
this.mActivity = null;
}
public synchronized boolean postExecution() {
Boolean dialogExists = mActivity.mDialogMap.get((Integer) dialogId);
if (dialogExists != null || dialogExists) {
onAfterExecute();
cleanUp();
}
public boolean cleanUp() {
mActivity.removeDialog(dialogId);
mActivity.mDialogMap.remove((Integer) dialogId);
mActivity.cleanupTask();
detach();
return true;
}
}