Страницы

Поиск по вопросам

вторник, 2 октября 2018 г.

К чему может привести использование static переменных?

Всем добрый вечер. В процессе разработки приложения есть большая необходимость передачи каких либо переменных из одной Активити в другую. Я использовал всегда стандартный метод: Intent intent = new Intent(First.this, Second.class); intent.putExtra("key",from_to); startActivity(intent); И далее получение: String from_to = getIntent().getExtras().getString("key", "null"); Но данный метод мне откровенно осточертел, и я решил делать это через static преременные так: static String from_to; Где то: from_to = "Hello dear Android"; И в другой активити: String from_to = First.from_to; Но теперь меня мучает вопрос: чем же это может обернуться для меня?! Заранее всем спасибо!


Ответ

Половина из написанного откровенная чушь не совсем верна. Если все делать по человечачьи то ужасов навроде #сборщикмусораубил или #нарвалсянаnullpointer можно избежать. В Android есть такой класс Application, который является естественным синглтоном. Как пишется в умной книжке: When your Application implementation is registered in the manifest, it will be instantiated when your application process is created. As a result your Application implementation is by nature a singleton and should be implemented as such to provide access to its methods and member variables. Надо всего лишь создать свой собственный Application типа: public class MyApplication extends Application { private static MyApplication singleton; private static MyVar myPreciousStaticVariable;
// Returns the application instance public static MyApplication getInstance() { return singleton; }
public final void onCreate() { super.onCreate(); singleton = this; } } Правильно задекларировать в манифесте и вперед. Нужные статические переменные (без фанатизма - то есть за минусом контекстов, юай элементов и проч. сумасшедшины) пихаем в MyApplication с правильной инициализацией в Application.onCreate() или в конструкторе (не забываем про lazy-init!), обкладываем статику геттерами (при необходимости и сеттерами) и все. Далее в более менее любом месте проги делаем так: myVar=MyApplication.getInstance().getMyPreciousStaticVariable(); Update С освобождением ресурсов в Application это действительно проблема. Поскольку в Application нет явного колбэка вызываемого при закрытии. Немного утешает, что Application создается еще до момента создания любой из компонент приложения - Activity, Service, Receiver и проч. так что вы не сможете в Application явным образом создать эти объекты. А общее правило при создании объекта гласит - уничтожай там же где и создал. Так что создаем скажем в Activity.onCreate() - стало быть уничтожаем в Activity.onDestroy() и т.д. В общем хранение синглтон объектов в Application имеет свои ограничения - я согласен. В любом случае Application будет выгружен последним и все что останется после него будет убрано сборщиком мусора - не совсем кошерно, конечно.

Комментариев нет:

Отправить комментарий