Урок 70. onSaveInstanceState. Сохранение данных Activity при повороте экрана
Урок 70. onSaveInstanceState. Сохранение данных Activity при повороте экрана
В этом уроке:
- сохраняем данные при повороте экрана
[url=http://www.startandroid.ru/ru/uroki/vse ... l:52ejsotd]Click here to read this article![/url:52ejsotd]
- сохраняем данные при повороте экрана
[url=http://www.startandroid.ru/ru/uroki/vse ... l:52ejsotd]Click here to read this article![/url:52ejsotd]
Последний раз редактировалось damager82 12 май 2017, 12:07, всего редактировалось 8 раз.
- KamiSempai
- Сообщения: 1339
- Зарегистрирован: 17 фев 2012, 21:23
- Откуда: Мордор
Re: Урок 70. onSaveInstanceState. Сохранение данных Activity
Я использую ArrayList из объектов. Стоит ли использовать onSaveInstanceState для его сохранения?
R.id.team
Хватит таскать макулатуру на тренировку! Используй T Note.
Хватит таскать макулатуру на тренировку! Используй T Note.
Re: Урок 70. onSaveInstanceState. Сохранение данных Activity
класс! давно ждал!
спасибо
спасибо
Re: Урок 70. onSaveInstanceState. Сохранение данных Activity
А в чем именно сомнение? Метод соответствующий есть у Bundle, тут все ок.KamiSempai писал(а):Я использую ArrayList из объектов. Стоит ли использовать onSaveInstanceState для его сохранения?
- KamiSempai
- Сообщения: 1339
- Зарегистрирован: 17 фев 2012, 21:23
- Откуда: Мордор
Re: Урок 70. onSaveInstanceState. Сохранение данных Activity
Не нашел такого метода, который можно применить к ArrayList<MyObject>. Единственное, что приходит в голову, это getParcelable. Но это нужно будет парсить, потом извлекать...damager82 писал(а):А в чем именно сомнение? Метод соответствующий есть у Bundle, тут все ок.
R.id.team
Хватит таскать макулатуру на тренировку! Используй T Note.
Хватит таскать макулатуру на тренировку! Используй T Note.
Re: Урок 70. onSaveInstanceState. Сохранение данных Activity
А, такого нет, да.KamiSempai писал(а):Не нашел такого метода, который можно применить к ArrayList<MyObject>.
Re: Урок 70. onSaveInstanceState. Сохранение данных Activity
У меня есть активити с 3-мя табами. в табах хранятся в ListView чекбоксы с параметрами. Задача состоит в том, чтобы при закрытии кнопкой назад в активити сохранялось состояние при повторном вызове. Описал onRestoreInstanceState и onSaveInstanceState но при закрытии ведь вызывается onDestroy. можно ли как-то самостоятельно вызывать эти методы?
Re: Урок 70. onSaveInstanceState. Сохранение данных Activity
Есть такое дело, при явном закрытии Activity методы не выполняются. Используйте, например, Preferences и пишите/читайте их в нужных Lifecycle методах.kolipass писал(а):Описал onRestoreInstanceState и onSaveInstanceState но при закрытии ведь вызывается onDestroy. можно ли как-то самостоятельно вызывать эти методы?
Re: Урок 70. onSaveInstanceState. Сохранение данных Activity
Спасибо за оперативный ответ. Но вот стройно ли будет писать/читать Preferences по 200 записей?
Re: Урок 70. onSaveInstanceState. Сохранение данных Activity
Тут выбор небольшой - либо Preferences, либо БД. Можно, ради интереса провести тест, записать туда и туда по 200 параметров и посмотреть разницу в производительности.kolipass писал(а):Спасибо за оперативный ответ. Но вот стройно ли будет писать/читать Preferences по 200 записей?
Вот прям ща никидаю программку и проверю. Отпишусь чуть позже, чего получилось.
Re: Урок 70. onSaveInstanceState. Сохранение данных Activity
А вообще как по-умному получить данные при явном закрытии Activity тому Activity которое его вызвало?
как так?
Код: Выделить всё
Intent intent = getIntent();
intent.putExtra("MyData", MyData);
Последний раз редактировалось kolipass 16 апр 2012, 15:25, всего редактировалось 1 раз.
- KamiSempai
- Сообщения: 1339
- Зарегистрирован: 17 фев 2012, 21:23
- Откуда: Мордор
Re: Урок 70. onSaveInstanceState. Сохранение данных Activity
Можно использовать startActivityForResult. 29 Урок.
R.id.team
Хватит таскать макулатуру на тренировку! Используй T Note.
Хватит таскать макулатуру на тренировку! Используй T Note.
Re: Урок 70. onSaveInstanceState. Сохранение данных Activity
Итак:
в БД и в Preferences апдейтю 200 записей типа name и value.
В таблице БД оба поля текстовые не ключевые, апдейт идет по name. Предварительно все записи уже созданы.
Запускаю несколько раз в течение работы приложения и замеряю время.
Для БД время апдейта всех записей от 1.7 до 2.5 сек.
Если сделать name ключевым полем - от 1.3 до 2.7 сек.
Если добавить использование транзакций - от 0.6 до 1 сек.
Для Preferences - от 0,05 до 0,14 сек.
Выводы:
- Preferences быстрее, чем БД
- используйте транзакции
в БД и в Preferences апдейтю 200 записей типа name и value.
В таблице БД оба поля текстовые не ключевые, апдейт идет по name. Предварительно все записи уже созданы.
Запускаю несколько раз в течение работы приложения и замеряю время.
Для БД время апдейта всех записей от 1.7 до 2.5 сек.
Если сделать name ключевым полем - от 1.3 до 2.7 сек.
Если добавить использование транзакций - от 0.6 до 1 сек.
Для Preferences - от 0,05 до 0,14 сек.
Выводы:
- Preferences быстрее, чем БД
- используйте транзакции
Re: Урок 70. onSaveInstanceState. Сохранение данных Activity
Всем привет. Я новичок, только осваиваю..
По сути, простенькая задача:
Приложение проигрывает инет-радио.. Play/Stop одной кнопкой..
При запуске приложения имеем button с текстом "play".. При нажатии, начинается воспроизведение и текст меняется на "stop"..
В стрингах, текстов не прописывал.. все через .setText();
И вот тут вопрос: Если в тот момент когда кнопка с текстом "Stop"(играет музыка) перезапустить activity(кнопкой назад до рабочего стола и повторным запуском приложения.. или поворот экрана), то кнопка снова с текстом "play".. как вылечить?
Музыка в бэкграунде играет, все норм.. но как сохранить данные и состояние Button при onDestroy(), а затем восстановить?
Заранее спасибо.
По сути, простенькая задача:
Приложение проигрывает инет-радио.. Play/Stop одной кнопкой..
При запуске приложения имеем button с текстом "play".. При нажатии, начинается воспроизведение и текст меняется на "stop"..
В стрингах, текстов не прописывал.. все через .setText();
И вот тут вопрос: Если в тот момент когда кнопка с текстом "Stop"(играет музыка) перезапустить activity(кнопкой назад до рабочего стола и повторным запуском приложения.. или поворот экрана), то кнопка снова с текстом "play".. как вылечить?
Музыка в бэкграунде играет, все норм.. но как сохранить данные и состояние Button при onDestroy(), а затем восстановить?
Заранее спасибо.
Код: Выделить всё
public class TestActivity extends Activity implements OnClickListener {
private final static String RADIO_STATION_URL = "http://scfire-dtc-aa05.stream.aol.com:80/stream/1041";
private Button buttonPlay;
private MediaPlayer player;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
initializeUIElements();
initializeMediaPlayer();
}
private void initializeUIElements() {
buttonPlay = (Button) findViewById(R.id.buttonPlay);
buttonPlay.setOnClickListener(this);
}
private void initializeMediaPlayer() {
player = new MediaPlayer();
try {
player.setDataSource(RADIO_STATION_URL);
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (IllegalStateException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
if (player.isPlaying()) {
buttonPlay.setText("Stop");
}
}
public void onClick(View v) {
if (v == buttonPlay) {
if(player.isPlaying()){
stopPlaying();
} else {
startPlaying();
}
}
}
private void startPlaying() {
buttonPlay.setEnabled(false);
buttonPlay.setText("Buffering...");
player.prepareAsync();
player.setOnPreparedListener(new OnPreparedListener() {
public void onPrepared(MediaPlayer mp) {
player.start();
buttonPlay.setEnabled(true);
buttonPlay.setText("Stop");
}
});
}
private void stopPlaying() {
if (player.isPlaying()) {
player.stop();
player.release();
initializeMediaPlayer();
buttonPlay.setText("Play");
}
}
}
- KamiSempai
- Сообщения: 1339
- Зарегистрирован: 17 фев 2012, 21:23
- Откуда: Мордор
Re: Урок 70. onSaveInstanceState. Сохранение данных Activity
Ага, все понятно. Насколько я понимаю, кроме проблем с кнопками есть проблема с остановкой воспроизведения. Ведь так?
Дело в том, что при повторном создании активити создается совершенно другой MediaPlayer, который не имеет ни какого отношения к первому.
Думаю лучше будет использовать Service.
Как узнать запущена служба или нет: http://kickasscode.ru/codes/19
Дело в том, что при повторном создании активити создается совершенно другой MediaPlayer, который не имеет ни какого отношения к первому.
Думаю лучше будет использовать Service.
Как узнать запущена служба или нет: http://kickasscode.ru/codes/19
R.id.team
Хватит таскать макулатуру на тренировку! Используй T Note.
Хватит таскать макулатуру на тренировку! Используй T Note.
Re: Урок 70. onSaveInstanceState. Сохранение данных Activity
Нет, проблемы с воспроизведением нет. Музычка играет в фоне..
А вот то что создается совершенно другой MediaPlayer не есть гуд =\
Буду дальше копать..
Желающие поучаствовать, велкам
Вместе -- больше идей)
А вот то что создается совершенно другой MediaPlayer не есть гуд =\
Буду дальше копать..
Желающие поучаствовать, велкам
Вместе -- больше идей)
- KamiSempai
- Сообщения: 1339
- Зарегистрирован: 17 фев 2012, 21:23
- Откуда: Мордор
Re: Урок 70. onSaveInstanceState. Сохранение данных Activity
Как по мне, так служба - это самое правильное решение. И копать ни куда не надо.
Можно еще хранить ссылку на плеер в абстрактном классе, так даже на много проще, но я ни чего не могу сказать, что случится если сборщик мусора наткнется на этот класс.
Можно еще хранить ссылку на плеер в абстрактном классе, так даже на много проще, но я ни чего не могу сказать, что случится если сборщик мусора наткнется на этот класс.
R.id.team
Хватит таскать макулатуру на тренировку! Используй T Note.
Хватит таскать макулатуру на тренировку! Используй T Note.
Re: Урок 70. onSaveInstanceState. Сохранение данных Activity
Что-то я с onRetainNonConfigurationInstance() туплю.. видимо ночное время суток сказывается.
Как это делать в onCreate(), если там у меня происходит инициализация: myObj = new MyObject(); или это где-то в другом месте необходимо делать? и второй вопрос, если нужно сохранять больше чем один объект, а в return всего один помещается?А, при создании нового Activity, в onCreate (например) мы используем метод getLastNonConfigurationInstance:
myObj = (MyObject) getLastNonConfigurationInstance();
Re: Урок 70. onSaveInstanceState. Сохранение данных Activity
Проверяйте, если getLastNonConfigurationInstance вернул null, значит вы ничего не сохраняли, значит надо создавать объект - выполняйте запланированную инициализацию.brucemax писал(а):Как это делать в onCreate(), если там у меня происходит инициализация: myObj = new MyObject();А, при создании нового Activity, в onCreate (например) мы используем метод getLastNonConfigurationInstance:
myObj = (MyObject) getLastNonConfigurationInstance();
Создавайте простой объект-контейнер, который будет содержать в себе ссылки на все необходимые для сохранения объекты, и возвращайте его. Если объекты однотипны - то просто массив используйте.brucemax писал(а):если нужно сохранять больше чем один объект, а в return всего один помещается?
Re: Урок 70. onSaveInstanceState. Сохранение данных Activity
Спасибо. Совсем мозг не варил..Проверяйте, если getLastNonConfigurationInstance вернул null, значит вы ничего не сохраняли, значит надо создавать объект - выполняйте запланированную инициализацию.
Вот задал это вопрос и сам об этом решении стал думать. Спасибо!Создавайте простой объект-контейнер, который будет содержать в себе ссылки на все необходимые для сохранения объекты, и возвращайте его. Если объекты однотипны - то просто массив используйте.