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);
} 

Thursday, April 13, 2017

RDP для ADB или подключаем телефон удаленно

Проблема: подключить телефон через локальный ноут к Android Studio на удаленном компе. 
Для меня было реальной проблемой из дома что-то протестировать на реальном устройстве, но тут очень прижало, и я решил выяснить как можно решить данную проблему. Постов много, действий тоже. Поэтому решил воспользоваться шикарной разработкой adbportforward.
Смысл утилиты довольно простой - запускаете сервер и клиент, который принимает пробрасываемые пакеты от сервера и вуаля - можно тестировать разработку.
Скачиваем джарник. Через cmd выполняем команду по запуску сервера (Сервер, это ноут, к которому подключен телефон):
"C:\Users\Andromeda\AppData\Local\Android\sdk\platform-tools\" - путь к ADB.
java -jar adbportforward.jar server adblocation="C:\Users\Andromeda\AppData\Local\Android\sdk\platform-tools\" 

На удаленном компе, где стоит Android Studio запускаем клиента:
remotehost - айпи вашего ноута
java -jar adbportforward.jar client "C:\some\Android\sdk\platform-tools\" 
remotehost=10.0.1.2
Готово, можно вести разработку через RDP и тестировать у себя на телефоне. 
Огромное спасибо автору данной утилиты
 Успехов!