Страница 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, значит вы ничего не сохраняли, значит надо создавать объект - выполняйте запланированную инициализацию.
Спасибо. Совсем мозг не варил..
Создавайте простой объект-контейнер, который будет содержать в себе ссылки на все необходимые для сохранения объекты, и возвращайте его. Если объекты однотипны - то просто массив используйте.
Вот задал это вопрос и сам об этом решении стал думать. Спасибо!