Урок 70. onSaveInstanceState. Сохранение данных Activity при повороте экрана

Обсуждение уроков
Аватара пользователя
damager82
Администратор
Сообщения: 1383
Зарегистрирован: 07 янв 2012, 11:32
Контактная информация:

Урок 70. onSaveInstanceState. Сохранение данных Activity при повороте экрана

Сообщение damager82 » 16 апр 2012, 00:00

В этом уроке:

- сохраняем данные при повороте экрана

[url=http://www.startandroid.ru/ru/uroki/vse ... l:52ejsotd]Click here to read this article![/url:52ejsotd]
Последний раз редактировалось damager82 12 май 2017, 12:07, всего редактировалось 8 раз.
Добро пожаловать на форум сайта StartAndroid
ИзображениеИзображение

Аватара пользователя
KamiSempai
Сообщения: 1339
Зарегистрирован: 17 фев 2012, 21:23
Откуда: Мордор

Re: Урок 70. onSaveInstanceState. Сохранение данных Activity

Сообщение KamiSempai » 16 апр 2012, 07:16

Я использую ArrayList из объектов. Стоит ли использовать onSaveInstanceState для его сохранения?
R.id.team
Хватит таскать макулатуру на тренировку! Используй T Note.

Аватара пользователя
andev
Сообщения: 219
Зарегистрирован: 13 янв 2012, 17:56

Re: Урок 70. onSaveInstanceState. Сохранение данных Activity

Сообщение andev » 16 апр 2012, 09:39

класс! давно ждал!
спасибо

Аватара пользователя
damager82
Администратор
Сообщения: 1383
Зарегистрирован: 07 янв 2012, 11:32
Контактная информация:

Re: Урок 70. onSaveInstanceState. Сохранение данных Activity

Сообщение damager82 » 16 апр 2012, 11:30

KamiSempai писал(а):Я использую ArrayList из объектов. Стоит ли использовать onSaveInstanceState для его сохранения?
А в чем именно сомнение? Метод соответствующий есть у Bundle, тут все ок.
Добро пожаловать на форум сайта StartAndroid
ИзображениеИзображение

Аватара пользователя
KamiSempai
Сообщения: 1339
Зарегистрирован: 17 фев 2012, 21:23
Откуда: Мордор

Re: Урок 70. onSaveInstanceState. Сохранение данных Activity

Сообщение KamiSempai » 16 апр 2012, 11:55

damager82 писал(а):А в чем именно сомнение? Метод соответствующий есть у Bundle, тут все ок.
Не нашел такого метода, который можно применить к ArrayList<MyObject>. Единственное, что приходит в голову, это getParcelable. Но это нужно будет парсить, потом извлекать...
R.id.team
Хватит таскать макулатуру на тренировку! Используй T Note.

Аватара пользователя
damager82
Администратор
Сообщения: 1383
Зарегистрирован: 07 янв 2012, 11:32
Контактная информация:

Re: Урок 70. onSaveInstanceState. Сохранение данных Activity

Сообщение damager82 » 16 апр 2012, 13:26

KamiSempai писал(а):Не нашел такого метода, который можно применить к ArrayList<MyObject>.
А, такого нет, да.
Добро пожаловать на форум сайта StartAndroid
ИзображениеИзображение

kolipass
Сообщения: 50
Зарегистрирован: 16 апр 2012, 14:10

Re: Урок 70. onSaveInstanceState. Сохранение данных Activity

Сообщение kolipass » 16 апр 2012, 14:19

У меня есть активити с 3-мя табами. в табах хранятся в ListView чекбоксы с параметрами. Задача состоит в том, чтобы при закрытии кнопкой назад в активити сохранялось состояние при повторном вызове. Описал onRestoreInstanceState и onSaveInstanceState но при закрытии ведь вызывается onDestroy. можно ли как-то самостоятельно вызывать эти методы?

Аватара пользователя
damager82
Администратор
Сообщения: 1383
Зарегистрирован: 07 янв 2012, 11:32
Контактная информация:

Re: Урок 70. onSaveInstanceState. Сохранение данных Activity

Сообщение damager82 » 16 апр 2012, 14:49

kolipass писал(а):Описал onRestoreInstanceState и onSaveInstanceState но при закрытии ведь вызывается onDestroy. можно ли как-то самостоятельно вызывать эти методы?
Есть такое дело, при явном закрытии Activity методы не выполняются. Используйте, например, Preferences и пишите/читайте их в нужных Lifecycle методах.
Добро пожаловать на форум сайта StartAndroid
ИзображениеИзображение

kolipass
Сообщения: 50
Зарегистрирован: 16 апр 2012, 14:10

Re: Урок 70. onSaveInstanceState. Сохранение данных Activity

Сообщение kolipass » 16 апр 2012, 14:50

Спасибо за оперативный ответ. Но вот стройно ли будет писать/читать Preferences по 200 записей?

Аватара пользователя
damager82
Администратор
Сообщения: 1383
Зарегистрирован: 07 янв 2012, 11:32
Контактная информация:

Re: Урок 70. onSaveInstanceState. Сохранение данных Activity

Сообщение damager82 » 16 апр 2012, 15:00

kolipass писал(а):Спасибо за оперативный ответ. Но вот стройно ли будет писать/читать Preferences по 200 записей?
Тут выбор небольшой - либо Preferences, либо БД. Можно, ради интереса провести тест, записать туда и туда по 200 параметров и посмотреть разницу в производительности.

Вот прям ща никидаю программку и проверю. Отпишусь чуть позже, чего получилось.
Добро пожаловать на форум сайта StartAndroid
ИзображениеИзображение

kolipass
Сообщения: 50
Зарегистрирован: 16 апр 2012, 14:10

Re: Урок 70. onSaveInstanceState. Сохранение данных Activity

Сообщение kolipass » 16 апр 2012, 15:12

А вообще как по-умному получить данные при явном закрытии 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

Сообщение KamiSempai » 16 апр 2012, 15:24

Можно использовать startActivityForResult. 29 Урок.
R.id.team
Хватит таскать макулатуру на тренировку! Используй T Note.

Аватара пользователя
damager82
Администратор
Сообщения: 1383
Зарегистрирован: 07 янв 2012, 11:32
Контактная информация:

Re: Урок 70. onSaveInstanceState. Сохранение данных Activity

Сообщение damager82 » 16 апр 2012, 15:49

Итак:
в БД и в Preferences апдейтю 200 записей типа name и value.
В таблице БД оба поля текстовые не ключевые, апдейт идет по name. Предварительно все записи уже созданы.

Запускаю несколько раз в течение работы приложения и замеряю время.

Для БД время апдейта всех записей от 1.7 до 2.5 сек.
Если сделать name ключевым полем - от 1.3 до 2.7 сек.
Если добавить использование транзакций - от 0.6 до 1 сек.

Для Preferences - от 0,05 до 0,14 сек.


Выводы:
- Preferences быстрее, чем БД
- используйте транзакции :)
Добро пожаловать на форум сайта StartAndroid
ИзображениеИзображение

feedme
Сообщения: 2
Зарегистрирован: 01 май 2012, 11:29

Re: Урок 70. onSaveInstanceState. Сохранение данных Activity

Сообщение feedme » 03 май 2012, 14:12

Всем привет. Я новичок, только осваиваю..

По сути, простенькая задача:
Приложение проигрывает инет-радио.. 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

Сообщение KamiSempai » 03 май 2012, 19:05

Ага, все понятно. Насколько я понимаю, кроме проблем с кнопками есть проблема с остановкой воспроизведения. Ведь так?
Дело в том, что при повторном создании активити создается совершенно другой MediaPlayer, который не имеет ни какого отношения к первому.
Думаю лучше будет использовать Service.
Как узнать запущена служба или нет: http://kickasscode.ru/codes/19
R.id.team
Хватит таскать макулатуру на тренировку! Используй T Note.

feedme
Сообщения: 2
Зарегистрирован: 01 май 2012, 11:29

Re: Урок 70. onSaveInstanceState. Сохранение данных Activity

Сообщение feedme » 03 май 2012, 21:48

Нет, проблемы с воспроизведением нет. Музычка играет в фоне..
А вот то что создается совершенно другой MediaPlayer не есть гуд =\
Буду дальше копать..

Желающие поучаствовать, велкам :)
Вместе -- больше идей)

Аватара пользователя
KamiSempai
Сообщения: 1339
Зарегистрирован: 17 фев 2012, 21:23
Откуда: Мордор

Re: Урок 70. onSaveInstanceState. Сохранение данных Activity

Сообщение KamiSempai » 04 май 2012, 07:08

Как по мне, так служба - это самое правильное решение. И копать ни куда не надо.
Можно еще хранить ссылку на плеер в абстрактном классе, так даже на много проще, но я ни чего не могу сказать, что случится если сборщик мусора наткнется на этот класс.
R.id.team
Хватит таскать макулатуру на тренировку! Используй T Note.

brucemax
Сообщения: 117
Зарегистрирован: 01 апр 2012, 16:09
Откуда: Минск
Контактная информация:

Re: Урок 70. onSaveInstanceState. Сохранение данных Activity

Сообщение brucemax » 27 окт 2012, 01:01

Что-то я с onRetainNonConfigurationInstance() туплю.. видимо ночное время суток сказывается.
А, при создании нового Activity, в onCreate (например) мы используем метод getLastNonConfigurationInstance:

myObj = (MyObject) getLastNonConfigurationInstance();
Как это делать в onCreate(), если там у меня происходит инициализация: myObj = new MyObject(); или это где-то в другом месте необходимо делать? и второй вопрос, если нужно сохранять больше чем один объект, а в return всего один помещается?

Аватара пользователя
damager82
Администратор
Сообщения: 1383
Зарегистрирован: 07 янв 2012, 11:32
Контактная информация:

Re: Урок 70. onSaveInstanceState. Сохранение данных Activity

Сообщение damager82 » 30 окт 2012, 09:31

brucemax писал(а):
А, при создании нового Activity, в onCreate (например) мы используем метод getLastNonConfigurationInstance:
myObj = (MyObject) getLastNonConfigurationInstance();
Как это делать в onCreate(), если там у меня происходит инициализация: myObj = new MyObject();
Проверяйте, если getLastNonConfigurationInstance вернул null, значит вы ничего не сохраняли, значит надо создавать объект - выполняйте запланированную инициализацию.
brucemax писал(а):если нужно сохранять больше чем один объект, а в return всего один помещается?
Создавайте простой объект-контейнер, который будет содержать в себе ссылки на все необходимые для сохранения объекты, и возвращайте его. Если объекты однотипны - то просто массив используйте.
Добро пожаловать на форум сайта StartAndroid
ИзображениеИзображение

brucemax
Сообщения: 117
Зарегистрирован: 01 апр 2012, 16:09
Откуда: Минск
Контактная информация:

Re: Урок 70. onSaveInstanceState. Сохранение данных Activity

Сообщение brucemax » 30 окт 2012, 20:09

Проверяйте, если getLastNonConfigurationInstance вернул null, значит вы ничего не сохраняли, значит надо создавать объект - выполняйте запланированную инициализацию.
Спасибо. Совсем мозг не варил..
Создавайте простой объект-контейнер, который будет содержать в себе ссылки на все необходимые для сохранения объекты, и возвращайте его. Если объекты однотипны - то просто массив используйте.
Вот задал это вопрос и сам об этом решении стал думать. Спасибо!

Ответить