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

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

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

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

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

Хранение данных Android
Хранение Message[] Android
Android Хранение данных в синглтоне - правильно ли это?
Android Хранение полученных данных
Хранение данных в приложении-справочнике Android
Внутреннее хранение данных data/data Android
Android Хранение числовых данных
Android Хранение учетных данных в приложении
Android Хранение настроек
Android Хранение переменных
Android Хранение пользовательских данных в облаке
Android Хранение дополнительных данных вне APK приложения

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
V0v1k
1157 / 981 / 1
Регистрация: 28.06.2012
Сообщений: 3,462
08.10.2013, 17:00     Хранение данных в onRetainNonConfigurationInstance() #2
draw2d и scaler принимают в конструкторе активити, а активити уже другая после пересоздания.
Yandex
Объявления
08.10.2013, 17:00     Хранение данных в onRetainNonConfigurationInstance()
Ответ Создать тему
Опции темы

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