0

当 Activity 终止时,例如在屏幕方向改变后,是否可以改变AsyncTaskActivity 上下文?否则它将产生错误,因为当活动终止时,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
4

2 回答 2

0

在您的异步任务的 OnCancel 方法中放置完成();

        public void onCancel(DialogInterface dialog) {
        cancel(true);
        dialog.dismiss();
        finish();
    }
于 2010-12-10T03:31:16.577 回答
0

你传递你的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;
 }
}
于 2010-12-10T06:11:25.943 回答