Страница 1 из 4
Урок 70. onSaveInstanceState. Сохранение данных Activity при повороте экрана
Добавлено: 16 апр 2012, 00:00
damager82
В этом уроке:
- сохраняем данные при повороте экрана
[url=
http://www.startandroid.ru/ru/uroki/vse ... l:52ejsotd]Click here to read this article![/url:52ejsotd]
Re: Урок 70. onSaveInstanceState. Сохранение данных Activity
Добавлено: 16 апр 2012, 07:16
KamiSempai
Я использую ArrayList из объектов. Стоит ли использовать onSaveInstanceState для его сохранения?
Re: Урок 70. onSaveInstanceState. Сохранение данных Activity
Добавлено: 16 апр 2012, 09:39
andev
класс! давно ждал!
спасибо
Re: Урок 70. onSaveInstanceState. Сохранение данных Activity
Добавлено: 16 апр 2012, 11:30
damager82
KamiSempai писал(а):Я использую ArrayList из объектов. Стоит ли использовать onSaveInstanceState для его сохранения?
А в чем именно сомнение? Метод соответствующий есть у Bundle, тут все ок.
Re: Урок 70. onSaveInstanceState. Сохранение данных Activity
Добавлено: 16 апр 2012, 11:55
KamiSempai
damager82 писал(а):А в чем именно сомнение? Метод соответствующий есть у Bundle, тут все ок.
Не нашел такого метода, который можно применить к ArrayList<MyObject>. Единственное, что приходит в голову, это getParcelable. Но это нужно будет парсить, потом извлекать...
Re: Урок 70. onSaveInstanceState. Сохранение данных Activity
Добавлено: 16 апр 2012, 13:26
damager82
KamiSempai писал(а):Не нашел такого метода, который можно применить к ArrayList<MyObject>.
А, такого нет, да.
Re: Урок 70. onSaveInstanceState. Сохранение данных Activity
Добавлено: 16 апр 2012, 14:19
kolipass
У меня есть активити с 3-мя табами. в табах хранятся в ListView чекбоксы с параметрами. Задача состоит в том, чтобы при закрытии кнопкой назад в активити сохранялось состояние при повторном вызове. Описал onRestoreInstanceState и onSaveInstanceState но при закрытии ведь вызывается onDestroy. можно ли как-то самостоятельно вызывать эти методы?
Re: Урок 70. onSaveInstanceState. Сохранение данных Activity
Добавлено: 16 апр 2012, 14:49
damager82
kolipass писал(а):Описал onRestoreInstanceState и onSaveInstanceState но при закрытии ведь вызывается onDestroy. можно ли как-то самостоятельно вызывать эти методы?
Есть такое дело, при явном закрытии Activity методы не выполняются. Используйте, например, Preferences и пишите/читайте их в нужных Lifecycle методах.
Re: Урок 70. onSaveInstanceState. Сохранение данных Activity
Добавлено: 16 апр 2012, 14:50
kolipass
Спасибо за оперативный ответ. Но вот стройно ли будет писать/читать Preferences по 200 записей?
Re: Урок 70. onSaveInstanceState. Сохранение данных Activity
Добавлено: 16 апр 2012, 15:00
damager82
kolipass писал(а):Спасибо за оперативный ответ. Но вот стройно ли будет писать/читать Preferences по 200 записей?
Тут выбор небольшой - либо Preferences, либо БД. Можно, ради интереса провести тест, записать туда и туда по 200 параметров и посмотреть разницу в производительности.
Вот прям ща никидаю программку и проверю. Отпишусь чуть позже, чего получилось.
Re: Урок 70. onSaveInstanceState. Сохранение данных Activity
Добавлено: 16 апр 2012, 15:12
kolipass
А вообще как по-умному получить данные при явном закрытии Activity тому Activity которое его вызвало?
Код: Выделить всё
Intent intent = getIntent();
intent.putExtra("MyData", MyData);
как так?
Re: Урок 70. onSaveInstanceState. Сохранение данных Activity
Добавлено: 16 апр 2012, 15:24
KamiSempai
Можно использовать startActivityForResult. 29 Урок.
Re: Урок 70. onSaveInstanceState. Сохранение данных Activity
Добавлено: 16 апр 2012, 15:49
damager82
Итак:
в БД и в 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
Добавлено: 03 май 2012, 14:12
feedme
Всем привет. Я новичок, только осваиваю..
По сути, простенькая задача:
Приложение проигрывает инет-радио.. 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");
}
}
}
Re: Урок 70. onSaveInstanceState. Сохранение данных Activity
Добавлено: 03 май 2012, 19:05
KamiSempai
Ага, все понятно. Насколько я понимаю, кроме проблем с кнопками есть проблема с остановкой воспроизведения. Ведь так?
Дело в том, что при повторном создании активити создается совершенно другой MediaPlayer, который не имеет ни какого отношения к первому.
Думаю лучше будет использовать Service.
Как узнать запущена служба или нет:
http://kickasscode.ru/codes/19
Re: Урок 70. onSaveInstanceState. Сохранение данных Activity
Добавлено: 03 май 2012, 21:48
feedme
Нет, проблемы с воспроизведением нет. Музычка играет в фоне..
А вот то что создается совершенно другой MediaPlayer не есть гуд =\
Буду дальше копать..
Желающие поучаствовать, велкам
Вместе -- больше идей)
Re: Урок 70. onSaveInstanceState. Сохранение данных Activity
Добавлено: 04 май 2012, 07:08
KamiSempai
Как по мне, так служба - это самое правильное решение. И копать ни куда не надо.
Можно еще хранить ссылку на плеер в абстрактном классе, так даже на много проще, но я ни чего не могу сказать, что случится если сборщик мусора наткнется на этот класс.
Re: Урок 70. onSaveInstanceState. Сохранение данных Activity
Добавлено: 27 окт 2012, 01:01
brucemax
Что-то я с onRetainNonConfigurationInstance() туплю.. видимо ночное время суток сказывается.
А, при создании нового Activity, в onCreate (например) мы используем метод getLastNonConfigurationInstance:
myObj = (MyObject) getLastNonConfigurationInstance();
Как это делать в onCreate(), если там у меня происходит инициализация: myObj = new MyObject(); или это где-то в другом месте необходимо делать? и второй вопрос, если нужно сохранять больше чем один объект, а в return всего один помещается?
Re: Урок 70. onSaveInstanceState. Сохранение данных Activity
Добавлено: 30 окт 2012, 09:31
damager82
brucemax писал(а):А, при создании нового Activity, в onCreate (например) мы используем метод getLastNonConfigurationInstance:
myObj = (MyObject) getLastNonConfigurationInstance();
Как это делать в onCreate(), если там у меня происходит инициализация: myObj = new MyObject();
Проверяйте, если getLastNonConfigurationInstance вернул null, значит вы ничего не сохраняли, значит надо создавать объект - выполняйте запланированную инициализацию.
brucemax писал(а):если нужно сохранять больше чем один объект, а в return всего один помещается?
Создавайте простой объект-контейнер, который будет содержать в себе ссылки на все необходимые для сохранения объекты, и возвращайте его. Если объекты однотипны - то просто массив используйте.
Re: Урок 70. onSaveInstanceState. Сохранение данных Activity
Добавлено: 30 окт 2012, 20:09
brucemax
Проверяйте, если getLastNonConfigurationInstance вернул null, значит вы ничего не сохраняли, значит надо создавать объект - выполняйте запланированную инициализацию.
Спасибо. Совсем мозг не варил..
Создавайте простой объект-контейнер, который будет содержать в себе ссылки на все необходимые для сохранения объекты, и возвращайте его. Если объекты однотипны - то просто массив используйте.
Вот задал это вопрос и сам об этом решении стал думать. Спасибо!