Saya sudah bekerja keras selama seminggu untuk menemukan solusi untuk dilema ini tanpa harus mengedit file manifes. Asumsi untuk solusi ini adalah:
- Anda selalu perlu menggunakan dialog progres
- Hanya satu tugas yang dilakukan sekaligus
- Anda perlu tugas untuk bertahan ketika telepon diputar dan dialog progres untuk secara otomatis ditolak.
Penerapan
Anda perlu menyalin dua file yang ditemukan di bagian bawah posting ini ke ruang kerja Anda. Pastikan saja:
Semua milik Anda Activity
harus diperluasBaseActivity
In onCreate()
, super.onCreate()
harus dipanggil setelah Anda menginisialisasi anggota yang perlu diakses oleh anggota Anda ASyncTask
. Juga, ganti getContentViewId()
untuk memberikan id tata letak formulir.
Ganti onCreateDialog()
seperti biasa untuk membuat dialog yang dikelola oleh aktivitas.
Lihat kode di bawah ini untuk contoh kelas dalam statis untuk membuat AsyncTasks Anda. Anda dapat menyimpan hasil Anda di mResult untuk diakses nanti.
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
}
}
Dan akhirnya, untuk meluncurkan tugas baru Anda:
mCurrentTask = new MyTask(this);
((MyTask) mCurrentTask).execute();
Itu dia! Saya harap solusi yang kuat ini akan membantu seseorang.
BaseActivity.java (mengatur impor sendiri)
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;
}
}