Ведение данных активности Android: onPause, onSaveInstanceState, onRetainNonConfigurationInstance - PullRequest
1 голос
/ 26 февраля 2011

У меня есть приложение Activity, которое в onCreate загружает файл XML из службы, используя AsyncTask. XML анализируется в ArrayList. Когда я переключаюсь на другой вид деятельности, а затем снова на основной вид деятельности, я хочу иметь возможность распознать, что этот файл XML уже загружен, и использовать заполненный ArrayList.

Каков наилучший способ сохранить это ArrayList?

onSaveInstanceState, кажется, поддерживает только примитивы, и я не смог установить случай, когда onRetainNonConfigurationInstance действительно вызывается. Поэтому в onCreate данные XML загружаются с сервера каждый раз, когда я переключаюсь на этот Activity. Я сделал модели, которые есть в ArrayList орудии Parcelable, так что вы могли бы использовать это каким-то образом?

Ответы [ 2 ]

3 голосов
/ 26 февраля 2011

Каков наилучший способ сохранить этот ArrayList?

Я не понимаю, где ваша проблема связана с несколькими действиями. Что произойдет, если пользователь нажмет HOME (задыхаясь!), Например? Ваше приложение в конечном итоге будет закрыто. Вы хотите перезагрузить данные с сервера? Если ответ «да», вам не нужно ничего «настаивать», и onSaveInstanceState() может быть достаточно (см. Ниже). Если ответ «нет», то вам нужно переосмыслить свой подход к модели данных, чтобы вы организовали хранение данных в базе данных, периодически синхронизируя их с вашим веб-сервисом, и, вероятно, выгрузив ArrayList и заменив его на Cursor.

onSaveInstanceState поддерживает только примитивы

Если ответ на мой вопрос HOME - «да», тогда вы можете просто удерживать данные в элементе данных вашей деятельности и, если они скромного размера, также сохранить их в Bundle в onSaveInstanceState(). Bundle может содержать ArrayList из Parcelable. Однако, если набор данных большой (скажем, 100 КБ или более), вы, вероятно, не хотите идти по этому пути и должны рассмотреть путь «нет», который я описал выше.

Мне не удалось настроить случай, когда onRetainNonConfigurationInstance действительно вызывается.

Поворот экрана. Существуют и другие сценарии, но изменения ориентации легче всего вызвать.

Однако это не имеет ничего общего с вашей проблемой.

1 голос
/ 26 февраля 2011

"onSaveInstanceState поддерживает только примитивы"

onSaveInstanceState поддерживает объекты, если они объявлены сериализуемыми.

// ON_SAVE_INSTANCE_STATE
// save instance data (5) on soft kill such as user changing phone orientation
protected void onSaveInstanceState(Bundle outState){
    password= editTextPassword.getText().toString(); 
    try {
        ConfuseTextStateBuilder b= ConfuseTextState.getBuilder();
        b.setIsShowCharCount(isShowCharCount);
        b.setTimeExpire(timeExpire); 
        b.setTimeoutType(timeoutType);
        b.setIsValidKey(isValidKey); 
        b.setPassword(password);
        state= b.build(); // may throw
    }
    catch(InvalidParameterException e){
        Log.d(TAG,"FailedToSaveState",e); // will be stripped out of runtime
    }
    outState.putSerializable("jalcomputing.confusetext.ConfuseTextState", state);  // save non view state
    super.onSaveInstanceState(outState); // save view state
    //Log.d(TAG,"onSaveInstance");
}
...