Действительно ли статическая переменная безопасна для обмена данными между действиями? - PullRequest
6 голосов
/ 14 декабря 2011

Я работаю над приложением, состоящим из пары действий:

  • Упражнение 1: главный экран приложения с кнопкой «Пуск»
  • Упражнение 2:пользователь выбирает свою личность из списка (более одного пользователя будет использовать приложение)
  • Упражнение 3: пользователь вводит пароль
  • Упражнение 4: пользователь выбирает событие из расписания (каждый пользовательимеет собственное расписание со связанными событиями)
  • Упражнение 5: пользователь может выбрать действие, связанное с заданием.
  • Операции 6-10: пользователь выполняет соответствующее действие.

Ниже приведена дополнительная информация:

  • каждое действие из 6-10 должно знать, какой пользователь вошел в систему и какое событие было выбрано
  • каждыйдействие из 6-10 имеет меню, которое позволяет пользователю вернуться к действиям: 1 (для выхода из системы), 4 (для выбора другого события), 5 (для выбора другого действия)

Ссейчас я использую пакеты для обмена данными между действиями, но, похоже, это усложняет код по мере увеличения количества действий (некоторые действия используют 3-4 действия для сбора данных от пользователя).Передача всех данных каждому созданному действию не кажется хорошей.

Я думаю о сохранении «имени пользователя» и выбранного «события» в качестве статических полей класса.Я очень сильно упросту код, но я не уверен, сохранятся ли эти данные, если пользователь скажет в какой-то момент нажать кнопку «Домой» и запустить другое приложение, которому требуется много памяти.

Будут ли данные, хранящиеся в статических полях, безопасными?

Ответы [ 7 ]

5 голосов
/ 14 декабря 2011

Лучше иметь собственный объект Application и хранить его там. Объект приложения будет жить так же долго, как и ваше приложение.

http://developer.android.com/reference/android/app/Application.html

Вы можете получить доступ к объекту Application, приведя getApplicationContext () к любому типу вашего пользовательского приложения:

public class CustomApplication extends Application {
    private String userId;

    public void onCreate() {
        super.onCreate();
        ...
    }

    public String getUserId() {
        return userId;
    }

    ...
}

Из звонка с мероприятия: ((CustomApplication) getApplicationContext()).getUserId();

3 голосов
/ 14 декабря 2011

Нет. Вам не гарантируется, что все они будут существовать в одном и том же загрузчике классов, и в этом случае вы будете иметь дело с разными копиями этих классов в разных местах и ​​не будете получать доступ к одному и тому же общему состоянию.

Это может произойти сейчас; но нет, это не то, что я бы назвал "безопасным".

1 голос
/ 30 июля 2016

Вы должны просто использовать систему намерений, как задумано.Статика и активность могут быть убиты, казалось бы, невольно Android.Даже класс Application может быть убит.

Допустим, у вас есть приложение, состоящее из двух действий, первое позволяет пользователю сохранять некоторые данные в объекте приложения.Затем пользователь нажимает кнопку, чтобы начать второе действие, которое отображает данные.Пользователь кладет свой телефон и возвращается к нему через несколько часов.

Android может решить убить приложение по различным причинам в течение этого времени.Когда пользователь возвращается, поднимает трубку и перезапускает ваше приложение, будет создан новый объект приложения, и будет восстановлено второе действие, но введенные пользователем данные больше не будут доступны в объекте приложения, поскольку это новый объект приложения..

Один из способов справиться с этим - использовать SharedPreferences даже для сложных объектов.Gson вполне способен сериализовать и десериализовать их в SharedPreferences.

Чтобы смоделировать это, вы можете сделать следующее:

$ adb shell ps |grep your.app.package

, чтобы получить pid вашего работающего приложения, затем

$ adb shell kill -9

, затем откройте приложение с помощью переключателя задач и выбудет иметь новый объект Application, но будет во втором действии.

1 голос
/ 14 декабря 2011

вы можете использовать SharedPreference для этого вместо использования статической переменной / объекта в классе. проверить этот блог http://android -er.blogspot.com / 2011/01 / пример использования sharedpreferencesedito.html

0 голосов
/ 14 декабря 2011

Статические данные сохранятся при нажатии кнопки «Домой», и при повторном открытии приложения вы перейдете в то же состояние, в котором вы оставили, но при запуске другого приложения, которому требуется много памяти, есть вероятность, что вы можете потерять все свои статические данные.Но если у вас очень мало статических данных, они могут сохраниться.

Вы также можете искать SharedPreference.

0 голосов
/ 14 декабря 2011

Статические поля работают, но не изящны.Вам просто нужен объект сеанса, следуя шаблону синглтона.

0 голосов
/ 14 декабря 2011

Вы можете использовать статические, если и до тех пор, пока вы не уверены, что эта статическая переменная не будет конфликтовать с пользователями.статическая переменная также является свойством класса, поэтому она потребляет больше памяти, поскольку время жизни - уровень приложения.другое, что я могу предложить, это использовать общие предпочтения, которые очень удобны.Доступ к этим общим настройкам может получить любой вид деятельности вашего приложения.поэтому не нужно передавать связку и беспокоиться о статических полях.Последний вариант, который я не считаю важным в вашем приложении, это «Использовать базу данных для хранения и получения».

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...