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

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

Войти
Регистрация
Восстановить пароль
 
xneo
0 / 0 / 0
Регистрация: 07.06.2014
Сообщений: 3
#1

Работа с активностями - Программирование Android

08.06.2014, 00:13. Просмотров 1052. Ответов 7
Метки нет (Все метки)

Здравствуйте. Только учусь... ))

Есть 3 активности.
Для передачи данных между ними использую просто класс со статическими полями. Поля являются ссылками на объекты. Тоесть первая активность создала объект и присвоила ссылку в статическое свойство класса. Вторая и третья активность использует эту ссылку. Может в таком способе есть какие подводные камни, не знаю, но надо передать именно объект.

Вызывается вторая/третья активность, принимает данные и отображает их в своих полях. Сворачиваем приложение. Если его развернуть через длительный промежуток времени (или вызвать из ярлыка) вываливается "ошибка программы". Отображается та же вторая или третья активность (которая была на момент свёртывания) но поля с данными уже пустые. Если времени прошло не много то данные остаются. Я так понимаю в момент развёртывания вызывается OnCreate? И наверное ошибка вызвана тем что активность пытается прочитать данные из объекта который по каким-то причинам уже удалён.

Если это так то почему? Что я упустил?
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
08.06.2014, 00:13
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Работа с активностями (Программирование Android):

Переход между активностями! - Программирование Android
не могу перейти между активностями! вот весь лог 12-27 14:32:51.611: D/dalvikvm(330): GC_EXTERNAL_ALLOC freed 83K, 51% free...

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

Затруднение с переключением между активностями - Программирование Android
Чтобы лучше понимать решил написать приложение расписания пар в университете и наткнулся на одну проблему. Создал одну активность в которой...

Передача данных между активностями - Программирование Android
к примеру есть 2 активности первая public class first_act extends Activity { @Override protected void onCreate(Bundle...

Кто как передаёт коллекции между активностями, классами? - Программирование Android
Всем привет! Поделитесь опытом. Допустим, в одном классе вы накапливаете данные (ArrayList), в другой передаёте. Там можете вывести в...

MediaPlayer, рывок перезапуска музыки при переходе между активностями - Программирование Android
Всем привет, есть приложение с несколькими активностями и при переходе между ними заметен рывок перезапуска музыки (onResume). Как сделать...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
YuraAAA
1571 / 1313 / 270
Регистрация: 25.10.2009
Сообщений: 3,432
Записей в блоге: 2
08.06.2014, 13:25 #2
Цитата Сообщение от xneo Посмотреть сообщение
Может в таком способе есть какие подводные камни, не знаю, но надо передать именно объект.
Это не правильно, это костыль Данные надо передавать в Intent'е. Туда можно передавать и объекты.

Цитата Сообщение от xneo Посмотреть сообщение
Если времени прошло не много то данные остаются. Я так понимаю в момент развёртывания вызывается OnCreate? И наверное ошибка вызвана тем что активность пытается прочитать данные из объекта который по каким-то причинам уже удалён.
Всё верно. В течении определённого кол-ва времени ОС андроид убивает приложение.

Хранить данные можно переопределив методы:

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
   /**
     * Можно сохранить состояние тут
     */
    @Override
    protected void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
        outState.putInt("MY_KEY", 1);
    }
 
    /**
     * Тут восстановливаем состояние
     */
    @Override
    protected void onRestoreInstanceState(Bundle savedInstanceState) {
        super.onRestoreInstanceState(savedInstanceState);
        int restoredKey = savedInstanceState.getInt("MY_KEY");
    }
xneo
0 / 0 / 0
Регистрация: 07.06.2014
Сообщений: 3
08.06.2014, 14:35  [ТС] #3
Цитата Сообщение от YuraAAA Посмотреть сообщение
Данные надо передавать в Intent'е. Туда можно передавать и объекты.
Как именно можно через интент передать объект? Именно ссылку на объект а не его сериализацию.
Я вот этот момент никак не пойму. Если у меня есть объект, который работает с сетью. Этот объект удерживает открытое сетевое соединение. Я же не могу сериализовать и передать его в другую активность. Мне надо пользоваться из нескольких активностей именно этим объектом, единым.

Цитата Сообщение от YuraAAA Посмотреть сообщение
Всё верно. В течении определённого кол-ва времени ОС андроид убивает приложение.
Я так понимаю, если бы андроид полностью убил приложение то при повторном запуске оно открылось с активностью по-умолчанию (первой). А оно открывается с третьей. Выходит приложение лежит в приостановленном виде в кеше.
Отсюда вопрос, разве при сбросе в кеш андроид не сохраняет в дамп все текущие данные приложения находящиеся в памяти?
И ещё один, есть какой-то атрибут по которому можно определить из какого состояния стартанула активность?
YuraAAA
1571 / 1313 / 270
Регистрация: 25.10.2009
Сообщений: 3,432
Записей в блоге: 2
08.06.2014, 14:45 #4
Цитата Сообщение от xneo Посмотреть сообщение
Отсюда вопрос, разве при сбросе в кеш андроид не сохраняет в дамп все текущие данные приложения находящиеся в памяти?
Видимо нет. Если Вы используете статику, она должна держаться в памяти пока приложение там висит. Видимо андроид знает внутреннее состояние активити при закрытии и восстанавливает его состояние и иерархию view, но не статику. Используйте методы которые я написал, они должны сработать.
Цитата Сообщение от xneo Посмотреть сообщение
Если у меня есть объект, который работает с сетью. Этот объект удерживает открытое сетевое соединение.
А попробуйте использовать Application для этого.

Создайте класс, унаследуйте его от TheApplication и храните там. Вот пример: http://stackoverflow.com/questions/2...ext-on-android
gevorg89
148 / 148 / 8
Регистрация: 10.07.2011
Сообщений: 251
10.06.2014, 03:16 #5
Для передачи объекта в intent нужно, чтобы класс был подписан на интерфейс Parcelable.
Вот пример.
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
import android.os.Parcel;
import android.os.Parcelable;
 
 
public class Student implements Parcelable
{
        public int age;
        public String name;
        
        public Student(Parcel parcel)
        {
            name=parcel.readString();
            age=parcel.readInt();           
        }
        
        public Student(int age,String name)
        {
            this.age=age;
            this.name=name;
        }
        @Override
        public int describeContents() {
            return 0;
        }
        @Override
        public void writeToParcel(Parcel dest, int flags) {
            dest.writeString(name);
            dest.writeInt(age);
        }
        
        public static final Parcelable.Creator<Student> CREATOR = new Parcelable.Creator<Student>() {
            public Student createFromParcel(Parcel in) {
                return new Student(in);
            }
 
            public Student[] newArray(int size) {
                return new Student[size];
            }
        };
}
В первом активити
Java
1
2
   Student st=new Student(20,"Andrew");
   intent.putExtra("student", st);
Во втором активити
Java
1
   Student  st = getIntent().getParcelableExtra("student");
YuraAAA
1571 / 1313 / 270
Регистрация: 25.10.2009
Сообщений: 3,432
Записей в блоге: 2
10.06.2014, 10:09 #6
Цитата Сообщение от gevorg89 Посмотреть сообщение
Для передачи объекта в intent нужно, чтобы класс был подписан на интерфейс Parcelable.
либо Serializable и .getSerializableExtra
xneo
0 / 0 / 0
Регистрация: 07.06.2014
Сообщений: 3
10.06.2014, 11:52  [ТС] #7
Цитата Сообщение от gevorg89 Посмотреть сообщение
Для передачи объекта в intent нужно, чтобы класс был подписан на интерфейс Parcelable.
Это я понимаю, но ведь в результате я получу две отдельные копии (два объекта) этого класса. В каждом активити будет своя. А меня интересует вариант чтобы объект был один, доступный в обеих активностях.

Почему нету варианта в стиле putExtra(Object obj)? Хотя... создавая интент мы же можем вызвать активность которая не принадлежит нашему приложению? Передать ссылку на объект в другой процесс мы конечно не сможем.
gevorg89
148 / 148 / 8
Регистрация: 10.07.2011
Сообщений: 251
10.06.2014, 16:05 #8
Сообщение было отмечено автором темы, экспертом или модератором как ответ
xneo, тогда надо использовать глобальные переменные, как говорил YuraAAA
вот один хороший пример
http://stackoverflow.com/questions/1...lobal-variable
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
10.06.2014, 16:05
Привет! Вот еще темы с ответами:

Передача объектов между активностями - Java EE
У меня есть сущность Test и мне необходимо передать объект этой сущности в другую активность, как это сделать? Я заметил что есть...

Нужна летиратура, в которой бы описывались работа с событиями, работа с элементами управления - C#
Помогите пожалуйста найти летиратуру, в которой бы описывались работа с событиями,работа со всеми элементами управления(toolbox).И если...

Количество подведенного и отведенного тепла, работа сжатия, работа расширения - Термодинамика и МКТ
Определить количество подведенного и отведенного тепла, работу сжатия, работу расширения, полезную работу и КПД цикла предыдущей...

Работа с Меню. Сохранение, печать, создать новый. Работа с рисованием - Visual C++
В общем сабж. Делается программа, которая должная Сохранять, печатать и очищать поле (создать новый/очистка). Также хочу спросить как...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
10.06.2014, 16:05
Ответ Создать тему
Опции темы

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