AndroidAnnotations — упрощаем и укорачиваем код без вреда для здоровья проекта (I часть)

от автора


Уже несколько лет существует и совершенствуется открытая библиотека для Android — Android Annotations
Она похожа на RoboJuice по возможностям, но если изучить ее тщательнее, то станет ясно — она гораздо обильнее по возможностям и реализована более удобным для использования в проекте способом.
Об этой библиотеке уже писали на Хабре, но кратко, да и она сама обновилась.
Что ж, пройдемся по AndroidAnnotations подробно, тем более она вошла в джентельменский набор разработки под Android.

Преимущества

Первое — это сокращение кода, вам больше не нужно искать по id вьюшки и отдельно определять для них слушателей.
Второе — это реализованная, как в самых эротических снах разработчиков под Android, работа с потоками.
Третье — удобное и лаконичное храние состояния активити/фрагмента
Четвертое — простое обращение с адаптерами ListView.
И еще много разных вкусностей…

Что внутри и как работает

Работает это великолепно! Вам не нужно наследоваться от RoboGreendroidOrmliteActionBarFragmentActivity и добавлять в проект тяжеловесные библиотеки. Аннотации обрабатываются на одном из шагов во время компиляции, в собранный проект добавляется лишь 50кб jar, остальное лежит и не лезет в собранный apk.
После аннотации Activity, во время компиляции AndroidAnnotations создаст наследника от него, в котором будут реализованы стандартные методы Android. А остальной код, который мы написали будет вызываться из предка. Из-за этого нам нужно в манифесе декларировать, a MyActivity_ — класс наследник MyActivity, автоматически генерируемый AndroidAnnotations.
Звучит страшно, но самом деле благодаря такому подходу мы как разработчики только выигрываем.
Производительность не падает — используются стандартные методы. А удобство написания растет во много раз.
И еще одна важная особенность: нам не нужно переписывать весь проект — достаточно аннотировать наши Activity/Fragment/View и использовать внутри только, те аннотации, которые нам нужны. А остальное писать, как мы привыкли это делать ранее, и как нам говорит официальная документация. К примеру, нужны в проекте только аннотации для потоков — их и аннотацию Activity/Fragment добавляем, а остальное пишем через стандартные методы.

Имлементация в проект

Здесь и далее всё описано для версии 2.6. Об изменениях в следующих версиях читайте чейнжлог

Настройки проекта

  • Скачиваем архив с библиотекой
  • androidannotations-2.6-api.jar — помещаем в папку «libs» нашего проекта.
  • androidannotations-2.6.jar — поместим в новую папку внутри проекта с названием «ext-libs».
  • Затем зайдем в «Project/Properties/Java compiler/Annotation Processing».
  • Ставим галочки «Enable project specific settings», «Enable annotations processing», «Enable processing in editor».
  • Заходим в подвкладку «Factory path»: ставим галочку «Enable project specific settings» и жмем «Add jar». Добавляем из папки «ext-libs» «androidannotations-2.6.jar». Жмем «apply» и «yes».
  • Во вкладке «Java Compiler» убеждаемся, что у нас «1.6» версия компилятора.
  • Во вкладке «Java Build Path/Source» жмем «Add Folder» и добавляем новую папку ".apt_generated".
  • Жмем ОК

Самое нудное закончилось, дальше начинается песня.

Простая Activity

Для начала аннотируем MainActivity — в манифесте:

        <activity             android:name=".MainActivity"             android:label="@string/title_activity_main" >             <intent-filter>                 <action android:name="android.intent.action.MAIN" />                  <category android:name="android.intent.category.LAUNCHER" />             </intent-filter> 

заменим .MainActivity на .MainActivity_
Аннотируем класс:

@EActivity(R.layout.main_activity) public class MainActivity extends Activity { 

Теперь перегрузку onCreate можно смело удалить и попробовать скомпилировать.

Запуск последующих Activity

В обычном Activity всегда выполняется метод инициализации элементов интерфейса, и только после его выполнения мы можем вызывать свои методы, обращающиеся к различным View. Для аннотированных Activity метод, который обращается к элементам интерфейса мы аннотируем вот так: @AfterViews
Далее попробуем запустить следующую аннотированную Activity, над которой и будем производить различные эксперименты:

   @AfterViews     protected void afterViews(){     	TestActivity_.intent(this).start();       } 

Вот таким простым способом запускаются аннотированные Activity
Для запуска с передачей экстры: TestActivity_.intent(context).myDateExtra(someDate).start();
где myDateExtra — аннотированное @ Extra сериализуемое protected-поле в TestActivity
Для запуска с флагами: TestActivity_.intent(context).flags(FLAG_ACTIVITY_CLEAR_TOP).start();

Аннотируем Activity по полной

Поиск View:

	  @ViewById 	  protected EditText testactivity_first_edittext;  	  @ViewById(R.id.testactivity_second_textview) 	  protected TextView secondTextView; 

Для сохранения состояния не нужно вынимать сохраненные объекты instance state вручную, достаточно:

    @InstanceState     String  stateToSave; 

И при измененнии состояния, например при повороте экрана — это поле не будет пересоздано, а сохранит свое значение.

Получение ресурсов, например строк:

    @StringRes(R.string.hello_world)     String myHelloString; 

Вешаем onClickListener:

	@Click(R.id.testactivity_first_button) 	void myButtonWasClicked() { 	    secondTextView.setText("first button was clicked"); 	} 

Слушаем изменения текста:

	 @TextChange(R.id.testactivity_second_edittext) 	 void onTextChangesOnSomeTextViews(TextView tv, CharSequence text) { 	 	Toast.makeText(this, "second textview was changed", Toast.LENGTH_SHORT).show(); 	 } 
Наиудобнейшая работа с потоками

В основном эту библиотеку в своих проектах я использую для работы с потоками.
Для этого используются две аннотации:
@ Background — аннотированный так метод выполнится в фоне
@ UiThread — так должен аннотироваться метод, вызываемый в фоновом потоке, но выполняющийся в потоке UI
Вот код примера:

	@Click(R.id.testactivity_second_button) 	protected void secondButtonWasClicked() { 		backgroundWork(); 	}  	@Background 	protected void backgroundWork() { 		publishProgress(0); 		publishProgress(10); 		publishProgress(100); 		onBGTaskFinish("bg task finished"); 	}  	@UiThread 	void publishProgress(int progress) { 		testactivity_first_edittext.setText("Background task progress: "+ progress); 	} 	 	@UiThread 	void onBGTaskFinish(String resultText){ 		secondTextView.setText(resultText); 	} 

На клик кнопки запускается фоновый поток, который во время своего выполнения публикует прогресс и в итоге передает результат выполнения.

На этом сегодня все, продолжение следует…

Библиотека
Описание всех аннотаций библиотеки
Быстрое внедрение библиотеки в новый проект
Проект-пример из статьи

ссылка на оригинал статьи http://habrahabr.ru/post/154851/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *