Android запускает асинхронную задачу при каждом изменении конфигурации - PullRequest
1 голос
/ 06 декабря 2011

Прочитав несколько статей о конфигурации Android, я все еще не знаю, как НЕ запускать асинхронную задачу, когда меняю вид с портретного на ландшафтный.Я загружаю некоторую информацию с сервера, и будет неразумно загружать ее каждый раз, когда я поворачиваю свой телефон.Я хочу загрузить его один раз.Могу ли я сделать это, не добавляя флаг 'changeConfig' в файл манифеста?

Ответы [ 3 ]

3 голосов
/ 06 декабря 2011

1 Сделайте ваш AsyncTask частной переменной экземпляра вашего класса (должен быть объявлен как статический внутренний класс или как отдельный файл).

2 Верните ваш экземпляр AsyncTask в onRetainConfigurationChanges()

  public Object onRetainNonConfigurationInstance() {
      return yourAsyncTask;
  }

3 Получить его в oResume():

 public void onResume() {
   Object data = getLastNonConfigurationInstance();
   if (data != null) {
     ... // pass in your activity to the AsyncTask so it can update your views
   } else {
     ... // create new AsyncTask and spin it up.
   }
 }
1 голос
/ 06 декабря 2011

Вам нужно посмотреть на это http://developer.android.com/resources/articles/faster-screen-orientation-change.html

Это решит все проблемы, о которых вы упомянули

В основном вам нужно реализовать

public Object onRetainNonConfigurationInstance()

, которая возвращает данныевы хотите

, а затем вам нужно вызвать getLastNonConfigurationInstance и, если значение есть, не получить его с сервера: -)

0 голосов
/ 06 декабря 2011

Не запускайте вслепую asyncTask.Следуйте этим инструкциям:

  1. определите 'boolean guard = false' в объявлении переменных деятельности
  2. inside "onCreate (...) do:

    if(savedInstanceState!=null){
        guard=(Boolean) savedInstanceState.get(guardkey) //guardkey is the bundle key. (*1)
    } else{
        guard=false;
    }
    if(!guard){
        //launch your asyncTask
        guard=true;
        //other operations if needed
    }
    

    Теперь добавьте к имеющемуся у вас методу onSaveInstanceState (outState) (если у вас его нет, сделайте это сейчас) следующую строку:

    outState.put(guardkey, guard); //(*1)
    

ПРИМЕЧАНИЕ:Это предотвращает запуск задач при каждом изменении конфигурации. Предполагается, что вы уже получили свою информацию с сервера и правильно сохранили ее в своей деятельности (это означает, что вы можете получить ее при перезапуске активности). В противном случае это решениене для тебя.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...