Sunday, December 17, 2017

Singleton: Шаблон программирования

Одним из самых распространенных и востребованных шаблонов является данный паттерн.
Singleton всегда один и тот же, в любом месте программы. В этом можно легко убедиться -  воспользоваться сверкой хэша созданного объекта.

public class SimpleSingleton(){
   //сущность
   private static SimpleSingleton simpleSingleton;
   //конструктор
   private SimpleSingleton();
   //инициализация
   public static SimpleSingleton getInstance(){
      if (simpleSingleton==null){
          simpleSingleton = new SimpleSingleton();
      }
      return simpleSingleton;
    }

}

Хоть в реализации и использован приватный конструктор, это никак не означает, что нельзя создать вторую сущность, отличную от первой(создается с помощью изменения конструктора). Для предотвращения такого поведения можно добавить в конструтор эксепш.
private SimpleSingleton(){
    if(simpleSingleton != null)
        throw new RuntimeException("Для получения Синглтона воспользуйтесь методом getInstance().");
}

Для получения потоко-независимого синглтона в объявление метода getInstance() нужно добавить ключевое слово synchronized. В этом случае поток выполнения будет всегда дожидаться окончания работы с объектом. И второй поток не сможет получить управление Singleton'ом. Самый существенный минус такого подхода - медленная производительность.
public synchronized static SimpleSingleton getInstance(){
      if (simpleSingleton==null){
          simpleSingleton = new SimpleSingleton();
      }
      return simpleSingleton;
}
 Аналогичный смысл представляет шаблон Registry (реестр) и Multiton(коллекция синглтонов).

Tuesday, December 12, 2017

Android transitions: плавное появление и исчезновение

Уж что-то я очень давно ничего не писал, надо бы это исправить:)
Изменим стандартные появления нового активити и его закрытия. Сделаем его плавно появляющимся.
Создаем анимации:
R.anim.activity_open_enter
<set    xmlns:android="http://schemas.android.com/apk/res/android"    android:shareInterpolator="false"    android:zAdjustment="top"    android:duration="2500">
    <alpha        android:duration="@android:integer/config_shortAnimTime"        android:fillAfter="false"        android:fillBefore="false"        android:fillEnabled="true"        android:fromAlpha="0.0"        android:interpolator="@android:interpolator/decelerate_cubic"        android:toAlpha="1.0" />
    <scale        android:duration="@android:integer/config_shortAnimTime"        android:fillAfter="false"        android:fillBefore="false"        android:fillEnabled="true"        android:fromXScale="1.1"        android:fromYScale="1.1"        android:interpolator="@android:interpolator/decelerate_quint"        android:pivotX="50%p"        android:pivotY="50%p"        android:toXScale="1.0"        android:toYScale="1.0" />
</set>
 
R.anim.activity_close_bottom
<set    xmlns:android="http://schemas.android.com/apk/res/android"    android:shareInterpolator="false"    android:zAdjustment="bottom"    android:duration="2500">
    <alpha        android:duration="@android:integer/config_shortAnimTime"        android:fillAfter="false"        android:fillBefore="false"        android:fillEnabled="true"        android:fromAlpha="0.0"        android:interpolator="@android:interpolator/decelerate_cubic"        android:toAlpha="1.0" />
    <scale        android:duration="@android:integer/config_shortAnimTime"        android:fillAfter="false"        android:fillBefore="false"        android:fillEnabled="true"        android:fromXScale="1.1"        android:fromYScale="1.1"        android:interpolator="@android:interpolator/decelerate_quint"        android:pivotX="50%p"        android:pivotY="50%p"        android:toXScale="1.0"        android:toYScale="1.0" />
</set>
Ну, а далее дело не хитрое - применяем анимацию  к старту активити и, 
соотвественно, к окончанию. Тут главный момент, устранить стандартную анимацию, поэтому добавляем 
OverridePendingTransition.
startActivity(intent);
overridePendingTransition(R.anim.activity_open_enter,0);   
 
@Overridepublic void finish() {
    super.finish();
    overridePendingTransition(R.anim.activity_close_bottom,0);
}