Getinstance android что это

Программирование для android

пятница, 15 июня 2012 г.

Синглетоны и наследники класса Application

При разработке приложений для android иногда бывает нужно чтобы какие-то переменные или методы были доступны из всех Activities (Деятельностей) приложения. Например, при работе с базой данной, как правило, пишется класс, который обеспечивает соединение с БД и выборку данных. Но создавать экземпляр этого класса в каждой Activity весьма расточительно. Хочется иметь один экземпляр и обращаться к нему из любой точки приложения.

Singleton

  1. public class Singleton <
  2. private static Singleton instance ;
  3. private Singleton ( ) <
  4. >
  5. public static Singleton getInstance ( ) <
  6. if ( null == instance ) <
  7. instance = new Singleton ( ) ;
  8. >
  9. return instance ;
  10. >
  11. >

Это класс в котором определен статический экземпляр этого же класса. В методе getInstance (), если этот экземпляр еще не был инициализирован, то вызывается конструктор. Сам конструктор определен как private, а значит мы не можем вне этого класса создать экземпляр с помощью оператора new.

Попробуем сделать это в приложении android. Я создала приложение с двумя похожими деятельностями

Создадим класс MySingleton (в отдельном файле MySingleton.java):

  1. class MySingleton <
  2. private static MySingleton mInstance ;
  3. private String MyVariable ;
  4. public static MySingleton getInstance ( ) <
  5. Log. w ( «MY_TAG» , «MySingleton::getInstance()» ) ;
  6. if ( mInstance == null ) <
  7. mInstance = new MySingleton ( ) ;
  8. >
  9. return mInstance ;
  10. >
  11. private MySingleton ( ) <
  12. Log. w ( «MY_TAG» , «MySingleton::MySingleton()» ) ;
  13. MyVariable = «This is my Variable» ;
  14. >
  15. public String getMyVariable ( ) <
  16. return MyVariable ;
  17. >
  18. public void setMyVariable ( String var ) <
  19. MyVariable = var ;
  20. >
  21. >

В классе определена переменная MyVariable, которая инициализируется в конструкторе и два метода для чтения и записи этой переменной getMyVariable() и setMyVariable().

В методы getInstance() и Singleton() я добавила отладочную печать Log.w(), чтобы в процессе работы приложения посмотреть как создается объект.

В обе деятельности добавим строчки

  1. public void onCreate ( Bundle savedInstanceState ) <
  2. .
  3. Log . w ( «MY_TAG» , «First Activity Start» ) ;
  4. EditText text = ( EditText ) findViewById ( R. id . text ) ;
  5. Singleton ms = MySingleton. getInstance ( ) ;
  6. text. setText ( ms. getMyVariable ( ) ) ;
  7. >

Запустим: в обоих деятельностях в EditText пишется значение переменой.

Посмотрим отладочную печать, для этого в Eclipse надо включить панель LogCat. В меню выберем Window->ShowView->Other. В открывшемся окошке находим Android->LogCat и нажимаем ОК. Теперь внизу появилась вкладка LogCat, куда выводятся все сообщения с эмулятора или подключенного устройства. Для удобства можно включить фильтр по тегу (у меня это «MY_TAG»).

При работе нашего приложения мы увидим что-то такое:
* First Activity Start
* MySingleton::getInstance()
* MySingleton::MySingleton()
* Second Activity Start
* MySingleton::getInstance()
* First Activity Start
* MySingleton::getInstance()

Как мы видим, конструктор вызывался только при первом запуске FirstActivity, а дальше getInstance() только возвращал переменную. Свою основную задачу класс Singleton выполняет: у нас есть один экземпляр класса доступный из любого места приложения.

Читайте также:  Android google play store version

Но в таком подходе есть один недостаток. Мы создаем экземпляр класса Singleton в контексте текущей Activity и если эта Activity завершает свою работу, то и экземпляр класса будет уничтожен (причем не сразу, а когда сработает сборщик мусора Java). А значит при следующем вызове getInstance() объект будет создаваться заново (вновь вызовется конструктор). Если в классе Singleton мы храним какие-то статичные переменные или методы, то это можно просто проигнорировать.

Вполне очевидным решением данной проблемы является создание экземпляра класса Singleton (первый вызов getInstance()) в какой-то Activity, которая будет жить на протяжении всего времени работы приложения. Но система android не может гарантировать, что неактивная Activity не будет уничтожена в случае нехватки памяти.

Класс Application

Класс Application — это базовый класс приложения android. При запуске программы вначале создается экземпляр этого класса, а потом уже необходимые деятельности. Напишем собственную реализацию этого класса.

Напишем в MyApp.java

  1. public class MyApp extends Application <
  2. @ Override
  3. public void onCreate ( ) <
  4. super . onCreate ( ) ;
  5. Log. w ( «MY» , «onCreate MyApp» ) ;
  6. MySingleton. initInstance ( ) ;
  7. >
  8. >
  1. class MySingleton <
  2. .
  3. public static void initInstance ( ) <
  4. Log. d ( «MY» , «MySingleton::InitInstance()» ) ;
  5. if ( mInstance == null ) <
  6. mInstance = new MySingleton ( ) ;
  7. >
  8. >
  9. public static MySingleton getInstance ( ) <
  10. Log. d ( «MY» , «MySingleton::getInstance()» ) ;
  11. return mInstance ;
  12. >
  13. .
  14. >
  1. android:icon = «@drawable/ic_launcher»
  2. android:label = «@string/app_name»
  3. android:name = «.MyApp» >
  4. .
  5. >

Запустим
Внешне ничего не изменилось, но теперь вне зависимости от того какие activities работают экземпляр класса MySingleton будет существовать.

Посмотрим логи:
onCreate MyApp
Singleton::InitInstance()
Singleton::Singleton()
First Activity Start
Singleton::getInstance()

Первым вызывается метод onCreate() класса MyApp в котором создается экземпляр класса MySingleton. Только после этого запускается FirstActivity.

В классе Application кроме метода void onCreate(), который вызывается при старте приложения есть также методы:
void onConfigurationChanged(Configuration newConfig) — Вызывается при изменении конфигурации устройства
void onLowMemory() — Вызывается когда система работает в условиях нехватки памяти, и просит работающие процессы попытаться сэкономить ресурсы.
void onTrimMemory(int level) — Вызывается, когда операционная система решает, что сейчас хорошее время для обрезания ненужной памяти из процесса.

Кстати, в классе Application можно хранить не только синглетоны, но и просто методы и переменные:

Источник

Метод Java Signature getInstance () с примерами

getInstance (Строковый алгоритм)

Метод getInstance () класса java.security.Provider используется для возврата объекта Signature, который реализует указанный алгоритм подписи.

Этот метод просматривает список зарегистрированных провайдеров безопасности, начиная с наиболее предпочтительного провайдера. Возвращается новый объект Signature, инкапсулирующий реализацию SignatureSpi от первого провайдера, который поддерживает указанный алгоритм.

Синтаксис:

Параметры: Этот метод принимает стандартное имя Алгоритма в качестве параметра.

Возвращаемое значение: этот метод возвращает новый объект подписи.

Исключение: этот метод генерирует исключение NoSuchAlgorithmException, если никакой провайдер не поддерживает реализацию подписи для указанного алгоритма.

Ниже приведены примеры, иллюстрирующие метод getInstance () :

Пример 1:

// Java-программа для демонстрации
// метод getInstance ()

Читайте также:  Команды для андроид смартфона

public class GFG1 <

public static void main(String[] argv)

// создание объекта Signature и получение экземпляра

// с помощью метода getInstance ()

Signature sr = Signature.getInstance( «SHA1WithRSA» );

// получение статуса объекта подписи

String str = sr.toString();

System.out.println( «Status : » + str);

catch (NoSuchAlgorithmException e) <

System.out.println( «Exception thrown : » + e);

catch (ProviderException e) <

System.out.println( «Exception thrown : » + e);

Пример 2: показать исключение NoSuchAlgorithmException

// Java-программа для демонстрации
// метод getInstance ()

public class GFG1 <

public static void main(String[] argv)

// создание объекта Signature и получение экземпляра

// с помощью метода getInstance ()

System.out.println( «Trying to get the instance of unknown instance» );

Signature sr = Signature.getInstance( «TAJMAHAL» );

// получение статуса объекта подписи

String str = sr.toString();

System.out.println( «Status : » + str);

catch (NoSuchAlgorithmException e) <

System.out.println( «Exception thrown : » + e);

catch (ProviderException e) <

System.out.println( «Exception thrown : » + e);

Подпись getInstance (Строковый алгоритм, поставщик провайдера)

Метод getInstance () класса java.security.Provider используется для возврата объекта подписи, который реализует указанный алгоритм подписи.

Новый объект Signature, инкапсулирующий реализацию SignatureSpi из указанного объекта Provider, возвращается. Обратите внимание, что указанный объект поставщика не должен быть зарегистрирован в списке поставщиков.

Синтаксис:

Параметры: Этот метод принимает следующие параметры в качестве параметров:

  • алгоритм — имя запрашиваемого алгоритма.
  • провайдер — провайдер

Возвращаемое значение: этот метод возвращает новый объект подписи.

Исключение: этот метод генерирует следующие исключения:

  • NoSuchAlgorithmException — если реализация SignatureSpi для указанного алгоритма не доступна из указанного объекта Провайдера.
  • IllegalArgumentException — если поставщик является нулем.

Ниже приведены примеры, иллюстрирующие метод getInstance () :

Пример 1:

// Java-программа для демонстрации
// метод getInstance ()

public class GFG1 <

public static void main(String[] argv)

// создание объекта Signature и получение экземпляра

// с помощью метода getInstance ()

Signature sr = Signature.getInstance( «SHA1WithRSA» );

// создание объекта Provider

Provider pd = sr.getProvider();

// получаем имя алгоритма

// с помощью getAlgorithm () mathod

String algo = sr.getAlgorithm();

// создание объекта Signature и получение экземпляра

// с помощью метода getInstance ()

Signature sr1 = Signature.getInstance(algo, pd);

// получение статуса объекта подписи

String str = sr1.toString();

System.out.println( «Status : » + str);

catch (NoSuchAlgorithmException e) <

System.out.println( «Exception thrown : » + e);

catch (ProviderException e) <

System.out.println( «Exception thrown : » + e);

Пример 2: показать исключение NoSuchAlgorithmException

// Java-программа для демонстрации
// метод getInstance ()

public class GFG1 <

public static void main(String[] argv)

// создание объекта Signature и получение экземпляра

// с помощью метода getInstance ()

Signature sr = Signature.getInstance( «SHA1WithRSA» );

// создание объекта Provider

Provider pd = sr.getProvider();

// получаем имя алгоритма

// с помощью getAlgorithm () mathod

String algo = sr.getAlgorithm();

// создание объекта Signature и получение экземпляра

// с помощью метода getInstance ()

Signature sr1 = Signature.getInstance( «TAJMAHAL» , pd);

// получение статуса объекта подписи

String str = sr1.toString();

System.out.println( «Status : » + str);

Читайте также:  Program using android studio

catch (NoSuchAlgorithmException e) <

System.out.println( «Exception thrown : » + e);

catch (ProviderException e) <

System.out.println( «Exception thrown : » + e);

Пример 3: показать IllegalArgumentException

// Java-программа для демонстрации
// метод getInstance ()

public class GFG1 <

public static void main(String[] argv)

// создание объекта Signature и получение экземпляра

// с помощью метода getInstance ()

Signature sr = Signature.getInstance( «SHA1WithRSA» );

// создание объекта Provider

Provider pd = null ;

// получаем имя алгоритма

// с помощью getAlgorithm () mathod

String algo = sr.getAlgorithm();

// создание объекта Signature и получение экземпляра

Источник

Блог Виктора Деревянко

О жизни, о программировании. Все публикуемые исходные коды можно взять здесь

воскресенье, 26 декабря 2010 г.

Синглетоны на Android. Как не стукнуться клювом об дерево.

Синглетон — объект существующий в единственном экземпляре. Удобнейшая штука для хранения объектов, существующих в течении всего времени жизни приложения: всякого рода настроек, кешей и т.д. Сильно злоупотреблять синглетонами не стоит, т.к. у них есть четко определенные недостатки. Однако в некоторых случаях без синглетонов (как и без глобальных переменных) просто не обойтись.

Синглетон можно реализовать разными способами. Обычно его реализуют так, чтобы он был доступен в любой точке приложения. Например, в виде класса, в котором все функции статические. Или в виде обычного класса со статичной функцией GetInstance() и приватным конструктором. Главное, учесть при реализации синглетона особенности языка программирования и платформы. Иначе ваше приложение рискует погрязнуть в ворохе непонятных и трудноуловимых багов. Я уже как-то писал об одной такой нетривиальной особенности реализации синглетона на CLI/C++. Оказалось, что и в реализации синглетона под Android есть подобная нетривиальная особенность.

Простейшая и вроде бы очевидная реализация синглетона под Android неверна. Пример:
Такой синглетон заработает. И может работать очень долго. Но в один прекрасный момент, вы рискуете получить null в getA() . Со всеми вытекающими последствиями.

Причина проста. Вы инициализируете статический класс синглетона в контексте Activity. Если в вашем приложении несколько activity, то синглетон доступен в каждой из них. Но если первоначальная activity, в которой создавался синглетон, будет уничтожена, то и синглетон тоже будет уничтожен. После этого, в других activity вы будете получать null вместо A. А ведь под андроидом подобное уничтожение activity дело обычное..

Проблема эта известна. Имеются решения:

  • создавать синглетон в контексте сервиса, а не в контексте activity;
  • унаследовать класс синглетона от класса Application .

На мой взгляд, второй способ проще. Если нет каких-либо особых противопоказаний, можно использовать именно его. Синглетон, унаследованный от Application , будет выглядеть так:
Нужно не забыть немножко подправить манифест, указав класс синглетона в качестве класса приложения:
MySingleton стал нестатическим классом. Тем не менее, обращаться к нему можно отовсюду, где имеется context — из виджета, из activity и т.п.
Не так удобно, как раньше, но вполне терпимо.

Источник

Оцените статью