Вопрос

Когда действие заканчивается, например, после изменения ориентации экрана, это возможно, что можно изменить 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;
 }
}

Другие советы

В методе накванке вашей асинч-задачи положить отделка ();

        public void onCancel(DialogInterface dialog) {
        cancel(true);
        dialog.dismiss();
        finish();
    }
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top