- PVSM.RU - https://www.pvsm.ru -
Уже несколько лет существует и совершенствуется открытая библиотека для Android — Android Annotations [1]
Она похожа на RoboJuice [2] по возможностям, но если изучить ее тщательнее, то станет ясно — она гораздо обильнее по возможностям и реализована более удобным для использования в проекте способом.
Об этой библиотеке уже писали на Хабре [3], но кратко, да и она сама обновилась.
Что ж, пройдемся по AndroidAnnotations подробно, тем более она вошла в джентельменский набор разработки под Android. [4]
Первое — это сокращение кода, вам больше не нужно искать по id вьюшки и отдельно определять для них слушателей.
Второе — это реализованная, как в самых эротических снах [5] разработчиков под Android, работа с потоками.
Третье — удобное и лаконичное храние состояния активити/фрагмента
Четвертое — простое обращение с адаптерами ListView.
И еще много разных вкусностей... [6]
Работает это великолепно! Вам не нужно наследоваться от RoboGreendroidOrmliteActionBarFragmentActivity и добавлять в проект тяжеловесные библиотеки. Аннотации обрабатываются на одном из шагов во время компиляции, в собранный проект добавляется лишь 50кб jar, остальное лежит и не лезет в собранный apk.
После аннотации Activity, во время компиляции AndroidAnnotations создаст наследника от него, в котором будут реализованы стандартные методы Android. А остальной код, который мы написали будет вызываться из предка. Из-за этого нам нужно в манифесе декларировать, a MyActivity_ — класс наследник MyActivity, автоматически генерируемый AndroidAnnotations.
Звучит страшно [7], но самом деле благодаря такому подходу мы как разработчики только выигрываем.
Производительность не падает — используются стандартные методы. А удобство написания растет во много раз.
И еще одна важная особенность: нам не нужно переписывать весь проект — достаточно аннотировать наши Activity/Fragment/View и использовать внутри только, те аннотации, которые нам нужны. А остальное писать, как мы привыкли это делать ранее, и как нам говорит официальная документация. К примеру, нужны в проекте только аннотации для потоков — их и аннотацию Activity/Fragment добавляем, а остальное пишем через стандартные методы.
Здесь и далее всё описано для версии 2.6. Об изменениях в следующих версиях читайте чейнжлог [8]
Самое нудное закончилось, дальше начинается песня.
Для начала аннотируем 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 всегда выполняется метод инициализации элементов интерфейса, и только после его выполнения мы можем вызывать свои методы, обращающиеся к различным 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();
Поиск 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 [10]
Вот код примера:
@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);
}
На клик кнопки запускается фоновый поток, который во время своего выполнения публикует прогресс и в итоге передает результат выполнения.
На этом сегодня все, продолжение следует…
Библиотека [11]
Описание всех аннотаций библиотеки [6]
Быстрое внедрение библиотеки в новый проект [4]
Проект-пример из статьи [12]
Автор: nekdenis
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/android-development/17780
Ссылки в тексте:
[1] Android Annotations: https://github.com/excilys/androidannotations/wiki
[2] RoboJuice: http://habrahabr.ru/post/116945/
[3] уже писали на Хабре: http://habrahabr.ru/post/123966/
[4] джентельменский набор разработки под Android.: http://habrahabr.ru/post/154827/
[5] эротических снах: http://planshetnyj.net/wp-content/uploads/android-apple-1.jpg
[6] И еще много разных вкусностей...: https://github.com/excilys/androidannotations/wiki/Cookbook
[7] Звучит страшно: https://github.com/excilys/androidannotations/wiki/HowItWorks#StartingAnAnnotatedActivity
[8] чейнжлог: https://github.com/excilys/androidannotations/wiki/ReleaseNotes
[9] архив с библиотекой: https://github.com/excilys/androidannotations/wiki/Download
[10] потоке UI: http://habrahabr.ru/post/142256/
[11] Библиотека: https://github.com/excilys/androidannotations/
[12] Проект-пример из статьи: https://github.com/nekdenis/AndroidAnnotationsSample
Нажмите здесь для печати.