تم إنهاء سياق Android Asynctask
-
25-09-2019 - |
سؤال
عندما ينتهي النشاط ، على سبيل المثال ، يتغير اتجاه الشاشة ، فهذا ممكن لتغيير ملف AsyncTask
سياق النشاط؟ وإلا فإنه سيخلق خطأ لأنه عندما ينتهي النشاط AsyncTask
لقد ذهب سياق النشاط أيضًا.
واجبي المنزلي هو ما يلي:
public void onSaveInstanceState(Bundle savedInstanceState) <- doesn't solve
public Object onRetainNonConfigurationInstance() <- doesn't solve
android:configChanges="keyboardHidden|orientation"
<- solved but doesn't handle well relative layouts
المحلول
ماذا تمرر onRetainNonConfigurationInstance()
؟ ما أقوم به هو تمرير كائن له يحتوي على AsyncTask
, ، ثم أحاول استرداد القيمة في getLastNonConfigurationInstance()
.
تحرير: في الفكر الثاني ، يعتمد ذلك على ما تريد القيام به بعد تغيير التكوين. إذا كنت تريد إنهاء AsyncTask
, ، ثم اتصل cancel()
عليه. إذا كنت ترغب في متابعة معالجتها حتى بعد تغيير الاتجاه ، فعليك التمسك بالمهمة.
يمكنك القيام بذلك عن طريق حفظ Activity
في ال AsyncTask
مثله:
private MyAsyncTask searchTask;
@Override
public void onCreate(Bundle savedInstance){
super.onCreate(savedInstance);
if (getLastNonConfigurationInstance()!=null) {
SavedObject savedObj = (SavedObject)getLastNonConfigurationInstance();
searchTask = savedObj.getAsyncTask();
searchTask.attach(this);
} else {
searchTask = new MyAsyncTask(this);
searchTask.execute();
}
}
@Override
public Object onRetainNonConfigurationInstance(){
searchTask.detach();
final SavedObject savedObj = new SavedObject();
savedObj.setAsyncTask(searchTask);
return savedObj;
}
private class MyAsyncTask extends AsyncTask<Void, Void, Void> {
MyActivity parentActivity = null;
MyAsyncTask (MyActivity activity) {
attach(activity);
}
void attach(MyActivity activity) {
this.parentActivity=activity;
}
void detach() {
parentActivity=null;
}
// Do your thread processing here
}
private class SavedObject {
private MyAsyncTask asyncTask;
public void setAsyncTask(MyAsyncTask asyncTask){
this.asyncTask = asyncTask;
}
public MyAsyncTask getAsyncTask() {
return asyncTask;
}
}
نصائح أخرى
في طريقة Oncancel لمهمة Asynch الخاصة بك وضع الانتهاء () ؛
public void onCancel(DialogInterface dialog) {
cancel(true);
dialog.dismiss();
finish();
}
لا تنتمي إلى StackOverflow