3

Я опытный .NET-разработчик, но это мое первое приложение для Android, и это сводит меня с ума!Активность Android Refreshing On Rotation

Это таймер обратного отсчета, который отлично работает, но когда вы поворачиваете экран, он повторно инициализировал активность, которая обнуляла и останавливала отсчет.

Это то, что я пробовал; Я избавился от объекта CountDownTimer и вместо этого создал класс, внутренний для активности, которая расширила AsyncTask, поэтому она запускалась в отдельном потоке ... Без изменений. Я понял, что это внутренний класс, который он повторно инициализирует с помощью деятельности.

Вот что я попробовал дальше; Я сделал класс внешним. Activity передает свой контекст классу, а onProgressUpdate & onPostExecute запускает публичные функции в контексте для обновления пользовательского интерфейса активности. Опять же, это прекрасно работает, пока вы не повернуть его ... Aaaargh!

Однако я обнаружил, что класс async все еще запущен, но пользовательский интерфейс не изменяется, потому что (я думаю), у этого действия теперь есть другой контекст, к которому относится ссылка класса async.

Так вот, где я. Каждое решение устраняет одну проблему. & создает другое. Нужно ли мне как-то поддерживать контекст, или я начинаю преследовать собственный хвост?

Любая помощь будет с благодарностью оценена!

Ta. Barry

+0

Спасибо, ребята, это невероятно полезно! Я считаю, что это моя проблема - мне просто нужно раскрыть мой код, чтобы быть более структурированным, и я смогу воспользоваться вашим советом ... Еще раз спасибо! –

ответ

1

Однако, я обнаружил, что класс асинхронного все еще работает, но интерфейс не меняется, потому что (я думаю) деятельность теперь имеет другой контекст для одного класса асинхронного имеет ссылку.

Приятно угадать. Вы должны обрабатывать Activity's lifecycle, если вы хотите сохранить вычисленные данные, так как всякий раз, когда вы поворачиваете устройство, активность воссоздается, поэтому onCreate() получает вызов без, сохраняя предыдущие вычисленные данные. Вы должны переопределить onSaveInstanceState(Bundle savedInstanceState) и onRestoreInstanceState(), чтобы сохранить свои вычисления. Взгляните на Activity's LifeCycle documentation и Reto Meier's answer, я думаю, что это решит вашу проблему.

1

Решение от Try_me34 хорошо, но вот некоторые другие способы для сохранения и восстановления данных (не размещать их в качестве комментария):

Попробуйте переопределение метода и сохранить процесс вторичного класса (возможно, таймер), а затем восстановить его, переопределяя onResume.

Другой вариант, чтобы сохранить его как предпочтение:

SharedPreferences.Editor editor = getSharedPreferences("nameOfFile", MODE_PRIVATE).edit(); 
editor.putInt("name", value); 
editor.putString("nameForString", value); 

, а затем загрузить его:

SharedPreferences prefs = getSharedPreferences("nameOfFile", MODE_PRIVATE); 
int i = prefs.getInt("tag", 0); 
String s = prefs.getString("tag", "defaultValue"); 
2

В вашем CountDownTimer реализации onTick:

@Override 
public void onTick(long millisUntilFinished) { 
    // something like this: 
    this.millisUntilFinished = millisUntilFinished; 
} 

В вашем Activity реализации onSaveInstanceState:

@Override 
public void onSaveInstanceState(Bundle savedInstanceState) { 
    // something like this: 
    savedInstanceState.putLong("millisUntilFinished", millisUntilFinished); 
} 

также в onCreate и onStart повторно настроить ваш CountDownTimer:

@Override 
public void onCreate(Bundle savedInstanceState) { 
    // ... 

    if (savedInstanceState != null) { 
     millisUntilFinished = savedInstanceState.getLong("millisUntilFinished"); 
    } 

} 

@Override 
public void onStart() { 
    super.onStart(); 
    timer = new MyCountDownTimer(millisUntilFinished, 100); 
    timer.start(); 
} 

Не копируйте этот код дословно, есть некоторые детали отсутствует/допущение, сделанное, которые будут отличаться в вашем коде, но это может выглядеть примерно так.