Форум программистов, компьютерный форум, киберфорум
Программирование Android
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.58/19: Рейтинг темы: голосов - 19, средняя оценка - 4.58
15 / 15 / 0
Регистрация: 20.06.2010
Сообщений: 142

Хранение данных в onRetainNonConfigurationInstance()

06.10.2013, 21:24. Показов 4055. Ответов 1
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем привет! Хочу сделать, чтобы при пересоздании активити (после блокировки\разблокировки девайса) все данные сохранялись. Для этого пользуюсь механизмом onRetainNonConfigurationInstance(), который сохраняет мой контейнер с данными, в последующим эти данные должны будут оттуда вытянуты. Однако столкнулся с проблемой. Вот код основного класса:
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
57
58
59
60
61
public class EditActivity extends Activity
{
    BundleContainer bundleContainer;
    DataContainer dataContainer = new DataContainer();
    DrillConfig drillConfig = new DrillConfig();
    Draw2D draw2d;
    private ScalerLine scaler;
    
    @SuppressWarnings("deprecation")
    @Override
    protected void onCreate(Bundle savedInstanceState) 
    {
        if (getLastNonConfigurationInstance() != null)
        {
            bundleContainer = (BundleContainer)getLastNonConfigurationInstance();
            dataContainer = bundleContainer.getDataContainer();
            drillConfig = bundleContainer.getDrillConfig();
        }
        
        requestWindowFeature (Window.FEATURE_NO_TITLE);
        
        LinearLayout.LayoutParams lParams = new LinearLayout.LayoutParams
                   (LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.MATCH_PARENT);
        LinearLayout.LayoutParams btnParams = new LinearLayout.LayoutParams
                   (LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT);
        
        frLayout = new FrameLayout (this);
        frLayout.setLayoutParams(lParams);
 
        if (getLastNonConfigurationInstance() != null)
        {
            draw2d = bundleContainer.getDraw2D();
            frLayout.addView(draw2d, lParams);
        }
        else
        {
            frLayout.addView(draw2d = new Draw2D (this, dataContainer, drillConfig), lParams);
        }
        
        scaler = new ScalerLine (this);
        if (getLastNonConfigurationInstance() != null)
        {
            scaler = bundleContainer.getScaler();
        }
        frLayout.addView(scaler);
        
        setContentView(frLayout);
         
        scaler.drawScaler(getStatusBar(), draw2d.mScaleFactor, draw2d.getScrollX(), draw2d.getScrollY());
        Log.d(TAG, "EditActivity: onCreate()");
 
        super.onCreate(savedInstanceState);
        bundleContainer = new BundleContainer (dataContainer, drillConfig, scaler, draw2d);
        setRequestedOrientation (ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
    }
    
    public BundleContainer onRetainNonConfigurationInstance()
    {
        Log.d(TAG, "retain");
        return bundleContainer;
    }
А это мой контейнер BundleContainer:
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
public class BundleContainer 
{
    private DataContainer dataContainer;
    private DrillConfig drillConfig;
    private ScalerLine scaler;
    private Draw2D draw2d;
    
    public BundleContainer(DataContainer dContainer, DrillConfig dConfig, ScalerLine dScaler, Draw2D d2d)
    {
        dataContainer = dContainer;
        drillConfig = dConfig;
        scaler = dScaler;
        draw2d = d2d;
    }
    
    public DataContainer getDataContainer()
    {
        return dataContainer;
    }
    
    public DrillConfig getDrillConfig()
    {
        return drillConfig;
    }
    
    public ScalerLine getScaler()
    {
        return scaler;
    }
    
    public Draw2D getDraw2D()
    {
        return draw2d;
    }
}
Проблема в следующем. При запуске приложения все объекты создаются с нуля, далее ссылки на них помещаются в bundleContainer. Потом вызывается setRequestedOrientation(), что пересоздает активити и bundleContainer сохраняется. Далее, т.к. getLastNonConfigurationInstance() возвращает не null, объекты уже не создаются, а просто вытягиваются из bundleContainer. Вот здесь и возникает загвоздка - при обращении к объектам draw2d и scaler, выскакивает ошибка NullPointerException, в то время как с dataContainer и drillConfig все работает нормально. Возможно, так происходит потому, что draw2d и scaler создаются в теле класса, а dataContainer и drillConfig создаются еще в полях класса? Прогонял код в отладчике, следил за draw2d и scaler - нифига они не null... Не понимаю, в чем проблема! Жду ваших идей, и заранее спасибо!

Добавлено через 4 часа 20 минут
Короче все, разобрался)) Объяснять, в чем проблема не буду, потому что проблемы, грубо говоря, и не было... =)) Все дело в моих кривых руках! ))
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
06.10.2013, 21:24
Ответы с готовыми решениями:

Хранение данных
Ребят посоветуйте способы хранения данных приложения,и плюсы каждого из них

Хранение полученных данных
В программе при запуске определённой активити запрашиваются данные с сервера (массив). Хочу сделать так чтоб если один раз данные получили...

Хранение числовых данных
Здравствуйте Создаем приложение на андроид, опыт практически нулевой И вот у нас возникли определенные неприятности, за время работы...

1
1162 / 986 / 1
Регистрация: 28.06.2012
Сообщений: 3,462
08.10.2013, 17:00
draw2d и scaler принимают в конструкторе активити, а активити уже другая после пересоздания.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
08.10.2013, 17:00
Помогаю со студенческими работами здесь

Хранение данных в приложении-справочнике
Есть задача написать приложение со списком заведений города... Есть текстовой файл с набором данных в виде: Название организации, адрес,...

Хранение учетных данных в приложении
Как правильно хранить учетные данные (логин/пароль) в приложении, чтобы их не смогли узнать посторонние лица?

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

Хранение данных в синглтоне - правильно ли это?
Приветствую, Приложение состоит из Activity и Service. Им обоим надо работать с данными, находящимися в ArrayList, который берет их из...

Хранение дополнительных данных вне APK приложения
Добрый вечер. Возник такой вопрос: делаю приложение на Unity. Для корректной работы нужны дополнительные данные которые должны храниться...


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

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Новые блоги и статьи
Установка Emscripten SDK (emsdk) и CMake на Windows для сборки C и C++ приложений в WebAssembly (Wasm)
8Observer8 30.01.2026
Чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. Система контроля версиями Git. . .
Подключение Box2D v3 к SDL3 для Android: физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL3_image
8Observer8 27.01.2026
Содержание блога SDL3_image - это библиотека для загрузки и работы с изображениями. Эта пошаговая инструкция покажет, как загрузить и вывести на экран смартфона картинку с альфа-каналом, то есть с. . .
Влияние грибов на сукцессию
anaschu 26.01.2026
Бифуркационные изменения массы гриба происходят тогда, когда мы уменьшаем массу компоста в 10 раз, а скорость прироста биомассы уменьшаем в три раза. Скорость прироста биомассы может уменьшаться за. . .
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
Установка Android SDK, NDK, JDK, CMake и т.д.
8Observer8 25.01.2026
Содержание блога Перейдите по ссылке: https:/ / developer. android. com/ studio и в самом низу страницы кликните по архиву "commandlinetools-win-xxxxxx_latest. zip" Извлеките архив и вы увидите. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru