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

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

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 14, средняя оценка - 4.93
razer89
15 / 15 / 0
Регистрация: 20.06.2010
Сообщений: 142
#1

Хранение данных в onRetainNonConfigurationInstance() - Программирование Android

06.10.2013, 21:24. Просмотров 1981. Ответов 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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
06.10.2013, 21:24
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Хранение данных в onRetainNonConfigurationInstance() (Программирование Android):

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

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

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

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

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

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

1
V0v1k
1159 / 983 / 1
Регистрация: 28.06.2012
Сообщений: 3,462
08.10.2013, 17:00 #2
draw2d и scaler принимают в конструкторе активити, а активити уже другая после пересоздания.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
08.10.2013, 17:00
Привет! Вот еще темы с ответами:

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

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

Внутреннее хранение данных data/data - Программирование Android
Здравствуйте. Пробую писать приложения под Андроид на С++, используя NDK. Для отладки приложения выбрал adb usb вариант с присоединением к...

Хранение переменных - Программирование Android
Доброго времени суток, уважаемые. Имеется около сотни переменных (не больше) которые будут изменяться раз 10-20 в день. Многие из них...


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

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Опции темы

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