Android异步任务上下文已终止

Android异步任务上下文已终止,android,android-activity,android-asynctask,android-context,terminate,Android,Android Activity,Android Asynctask,Android Context,Terminate,当活动终止时,例如在屏幕方向更改后,是否可以更改AsyncTask活动上下文?否则它将创建一个错误,因为当活动终止时,AsyncTask的活动上下文也消失了 我的家庭作业如下: public void onSaveInstanceState(Bundle savedInstanceState) <- doesn't solve public Object onRetainNonConfigurationInstance() <- doesn't solve 异步任务put fin

当活动终止时,例如在屏幕方向更改后,是否可以更改
AsyncTask
活动上下文?否则它将创建一个错误,因为当活动终止时,
AsyncTask
的活动上下文也消失了

我的家庭作业如下:

public void onSaveInstanceState(Bundle savedInstanceState) <- doesn't solve
public Object onRetainNonConfigurationInstance()  <- doesn't solve

异步任务put finish()的OnCancel方法中的public void onSaveInstanceState(Bundle savedInstanceState)


在您的
onRetainonConfiguration实例()上传递什么内容?我要做的是向它传递一个包含
AsyncTask
的对象,然后尝试在
getLastNonConfigurationInstance()
中检索该值

编辑:再想一想,这将取决于配置更改后要执行的操作。如果要终止
异步任务
,然后对其调用
cancel()
。如果你想在方向改变后继续处理它,那么你必须坚持任务

您可以通过将
活动
保存在
异步任务
中,如下所示:

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;
 }
}
private MyAsyncTask searchTask;
@凌驾
创建时的公共void(Bundle savedInstance){
super.onCreate(savedInstance);
如果(getLastNonConfigurationInstance()!=null){
SavedObject savedObj=(SavedObject)getLastNonConfigurationInstance();
searchTask=savedObj.getAsyncTask();
searchTask.attach(此);
}否则{
searchTask=新的MyAsyncTask(此任务);
searchTask.execute();
}
}
@凌驾
公共对象OnRetainOnConfiguration实例(){
searchTask.detach();
final SavedObject savedObj=新的SavedObject();
savedObj.setAsyncTask(searchTask);
返回savedObj;
}
私有类MyAsyncTask扩展了AsyncTask{
MyActivity parentActivity=null;
MyAsyncTask(MyActivity活动){
附加(活动);
}
无效附加(MyActivity活动){
这个。parentActivity=活动;
}
void detach(){
parentActivity=null;
}
//在这里进行线程处理
}
私有类SavedObject{
私有MyAsyncTask异步任务;
公共void setAsyncTask(MyAsyncTask asyncTask){
this.asyncTask=asyncTask;
}
公共MyAsyncTask getAsyncTask(){
返回异步任务;
}
}
        public void onCancel(DialogInterface dialog) {
        cancel(true);
        dialog.dismiss();
        finish();
    }
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;
 }
}