Форум программистов, компьютерный форум CyberForum.ru

Программирование Android

Войти
Регистрация
Восстановить пароль
 
arvalon
21 / 6 / 2
Регистрация: 26.10.2012
Сообщений: 154
Записей в блоге: 1
#1

Как правильно сохранять/восстанавливать данные из Bundle - Программирование Android

02.07.2016, 17:47. Просмотров 473. Ответов 3
Метки нет (Все метки)

Доброго дня.
Не могу точно разобраться где вызывать сохранение данных в Bundle и извлечение их оттуда.

В Активити есть поле ImageView куда я получаю фото с камеры. И при повороте экрана это поле очищается. Если прооверрайдить методы onPause и onResume и добавить в них Log.d то я вижу что при повороте экрана вызываются onPause-onCreate-onResume. Всё как и должно быть.

Но где создавать Bundle и сохранять туда BitMap как массив байтов, в onPause ИЛИ ещё в одном прооверрайдженом методе класса - onSaveInstanceState?
И восстанавливать поле ImageView из Bundle в onCreate, onRestore или аналогично добавить ещё метод onRestoreInstanceState в класс?

Не очень хорошо смог перевести с английского с stackoverflow.com
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
02.07.2016, 17:47     Как правильно сохранять/восстанавливать данные из Bundle
Посмотрите здесь:

Как правильно присвоить переменным данные для использования с другом методе? - Программирование Android
Привет всем! Есть такая проблема... есть push уведомления, и когда приходит уведомление их нужно добавить в массив для показа в...

Как правильно обновить данные для списка при изменении данных в другом фрагменте? - Программирование Android
Здравствуйте. Подскажите как правильно обновить данные для адаптера списка в главном фрагменте при изменении списка в дочернем фрагменте....

Сохранение в Bundle данных - Программирование Android
Вот когда идет сохранение состояния активити onSaveInstanceState(Bundle outState). Оно сохраняется в обьект Bundle. А где эти данные хранит...

Adt-bundle-windows - Программирование Android
Здравствуйте, Уважаемые программисты Андроид! Сориентируйте пожалуйста по такому вопросу. Установил adt-bundle-windows с поддержкой С++....

Получить массив из Bundle extras - Программирование Android
Приходит intent. Bundle extras = intent.getExtras(); extras содержит: Bundle как можно получить все данные и записать их...

Переопределение onSaveInstanceState(Bundle) и отображение текста по нажатию - Программирование Android
Наверное сложно будет понять чего я хочу, но вдруг... Через Intent из родительской активности перехожу в дочернюю. Там при нажатии...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
CoolMind
418 / 401 / 65
Регистрация: 06.10.2012
Сообщений: 1,727
02.07.2016, 17:55     Как правильно сохранять/восстанавливать данные из Bundle #2
Цитата Сообщение от arvalon Посмотреть сообщение
И восстанавливать поле ImageView из Bundle в onCreate, onRestore или аналогично добавить ещё метод onRestoreInstanceState в класс?
В onCreate или onRestoreInstanceState (но проще в первом). Если onCreate не выполняется, значит, активность не разрушена, данные не потеряны.
Цитата Сообщение от arvalon Посмотреть сообщение
Но где создавать Bundle и сохранять туда BitMap как массив байтов, в onPause ИЛИ ещё в одном прооверрайдженом методе класса - onSaveInstanceState?
Я обычно использую onSaveInstanceState, но он не является частью жизненного цикла, поэтому в некоторых случаях может быть не вызван. Поэтому критически важную информацию лучше сохранять в onPause. Хотя, с другой стороны, там нет Bundle, и вызываться onPause будет чаще, чем onSaveInstanceState.
arvalon
21 / 6 / 2
Регистрация: 26.10.2012
Сообщений: 154
Записей в блоге: 1
02.07.2016, 23:05  [ТС]     Как правильно сохранять/восстанавливать данные из Bundle #3
Добавил логгирование во все методы, участвующие в жизненном цикле. Да, onSaveInstanceState не вызывается. Но зато вызывается onRestoreInstanceState! Странно, я думал они работают в паре и как-то вмешаны в основной жизненный цикл.

onPause->onCreate->onRestoreInstanceState->onResume

Значит место где можно сохранить данные - onPause. А в нём просто создаётся новый бандл и заполняется парами ключ-значение?

Bundle bundle=new Bundle();
bundle.putByteArray(...,...);

Добавлено через 4 часа 56 минут
Понял почему не вызывался onSaveInstanceState, добавил в класс public метод, а надо было protected. Теперь работает, но только 1 раз Т.е. получаю фото в ImageView, поворачиваю - фото сохраняется. Поворачиваю ещё раз - стирается. Никаких NullPointerException не вылетает.
Не могу понять почему при втором повороте картинка не восстанавливается из outState
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
public class AddEquipment extends AppCompatActivity {
 
    private static final int TAKE_PHOTO = 1;
    private static final String EQUIPMENT_IMAGE = "EQUIPMENT_IMAGE";
    private Button addPhoto;
    private ImageView equipmentImage;
    private Bitmap bp;
 
    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        Log.d("happy","onCreate");
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_addequipment);
 
        addPhoto=(Button)findViewById(R.id.addPhoto);
        addPhoto.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                addPhoto();
            }
        });
 
        equipmentImage=(ImageView)findViewById(R.id.equipment_image);
 
    }
 
    private void addPhoto() {
        Intent i = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
        startActivityForResult(i, TAKE_PHOTO);
    }
 
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        if (requestCode == TAKE_PHOTO) {
            if (resultCode == RESULT_OK) {
                if (data != null && data.getData() != null) {
                    Log.d("happy","Photo is getted");
                    bp = (Bitmap) data.getExtras().get("data");
                    equipmentImage.setImageBitmap(bp);
                }
            }
        }
    }
 
    @Override
    protected void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
        Log.d("happy","ONSAVEINSTANTSTATE");
        outState.putParcelable(EQUIPMENT_IMAGE,bp);
    }
 
    @Override
    protected void onRestoreInstanceState(Bundle savedInstanceState) {
        super.onRestoreInstanceState(savedInstanceState);
        Log.d("happy","ONRESTOREINSTANTSTATE");
        equipmentImage.setImageBitmap((Bitmap)savedInstanceState.getParcelable(EQUIPMENT_IMAGE));
    }
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
03.07.2016, 14:49     Как правильно сохранять/восстанавливать данные из Bundle
Еще ссылки по теме:

Как в отдельном классе сохранять переменные? - Программирование Android
Добрый день! есть класс, в нем сотни переменных, их значения меняются. как сохранять их значения и как вызывать из другого класса...

Как сохранять добавленное в ListView поле? - Программирование Android
День добрый. Подскажите как можно сохранять добавленное поле , что бы в следующий раз при запуске приложения оно было и добавлять к...

Как сохранять значения именно в кэш-память, а не в оперативку? - Программирование Android
Как сохранять значения именнов кэш память а не в оперативку?? Какие есть инструменты (классы Java) для работы с кэшем в android??

Как сохранять информацию о пользователе и использовать её в дальнейшем уведомлении? - Программирование Android
Форумчане, позвольте спросить: как сохранять имя и фамилию пользователя и использовать их в уведомлении? Ранее Java не занимался...

Как извлечь данные из сервера Parse, чтобы эти данные были видны всем? - Программирование Android
У меня есть активити, где есть строка, куда вводишь данные и они отправляются на сервер, и они сохраняются именно в этом активити и их вижу...

Как изменить цвет пункта ListView при нажатии на него и сохранять его цвет при проматывании списка? - Программирование Android
Здравствуйте, подскажите, пожалуйста, как изменить цвет пункта ListView при нажатии на него и сохранять его цвет при проматывании списка? ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Pablito
2455 / 1900 / 591
Регистрация: 12.05.2014
Сообщений: 6,706
Завершенные тесты: 1
03.07.2016, 14:49     Как правильно сохранять/восстанавливать данные из Bundle #4
отключить пересоздание активти при повороте экрана
или сохранять полученный снимок в виде файла и работать с ним
Yandex
Объявления
03.07.2016, 14:49     Как правильно сохранять/восстанавливать данные из Bundle
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru