Как улучшить читабельность нашего Android-кода или используем android-annotations

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


    Библиотека android-annotations позволяет сократить объем кода на такие действия как:
    1.Загрузка ресурсов
    2.Поиск вьюшки по идентификатору(findViewById метод)
    3.Привязка обработчиков к кнопкам
    4.Получение сервисов(ссылок на классы сервисов), фоновую обработку и другие полезные штуки в простейшем виде.

    Как установить.

    Скачиваем по ссылке выше два jar-а:androidannotations-X.X.X.jar(процессор аннотаций) и сам апи: androidannotations-X.X.X-api.jar. Далее, заходим в Eclipse в свойства проекта в пункт Java Compiler, выбираем Annotation Processors, затем ставим галку в этом меню — Enable project specific settings. После этого необходимо зайти в подпункт Factory Path, снова поставить ту же галку и нажав на Add externak JARs добавить путь к процессору аннотаций.
    Это еще не все. После проделанного необходимо зайти в пункт Java Build Path и добавить androidannotations-X.X.X-api.jar во вкладке Libraries данный JAR. Теперь все настроено и готово.

    Пример использования.

    Данная библиотека требует от вас следующего: когда вы используете аннотации из данной библиотеки, то ваш активити в манифесте должен заканчиваться знаком "_". То бишь, у вас есть активити SMSSender, тогда в манифест необходимо добавить активити SMSSender_. Вот такие дела.

    Далее приведу кусок примера:
    import com.googlecode.androidannotations.annotations.*;
    import com.googlecode.androidannotations.annotations.res.*;
    
    @EActivity(R.layout.main) //аля setContentView()
    public class SMSSenderActivity extends Activity {
    
    @ViewById(R.id.ok_button) //аля findViewById()
    Button buttOk;
    
    @StringRes   //загружаем строковый ресурс R.string.message
    String message;
    ...
    
    @Click(R.id.ok_button) //связываем обработчик с нашей кнопкой
    void okClickHandler(){
        ...
    }
    


    Красиво не так ли? Заметьте, что у нас нет привычного метода onCreate и прекрасно все работает! Но ничто не мешает его добавить, как и другие методы состояний активити.

    Как это работает? Заглянем в вики: «AndroidAnnotations works in a very simple way. It automatically adds an extra compilation step that generates source code, using the standard Java Annotation Processing Tool.» Собственно потому и нужно добавлять прекфик в манифест или при старте активити. Также замечу, что если не указывать id, то ресурс будет подгружаться по имени переменной, что также удобно для читаемости кода.

    Более полный пример со многими возможностями представлен тут:
    code.google.com/p/androidannotations/source/browse/trunk/HelloWorldEclipse/src/com/googlecode/androidannotations/helloworldeclipse/MyActivity.java

    Стоит отметить, что аннотацию @BeforeViews(как в коде по ссылке выше) я так и не нашел, но зато есть @BeforeCreate.

    Вот некоторые доступные аннотации:
    @ColorRes
    @StringRes
    @AnimationRes
    @BooleanRes
    @ColorStateListRes
    @DimensionRes
    @DimensionPixelOffsetRes
    @DimensionPixelSizeRes
    @DrawableRes
    @IntArrayRes
    @IntegerRes
    @LayoutRes
    @MovieRes
    @TextRes
    @TextArrayRes
    @StringArrayRes
    Extra
    @SystemService
    Background
    @UiThread
    @UiThreadDelayed
    @RoboGuice

    И многие другие. Да, с библиотекой можно совместно использовать RoboGuice.
    Многие вещи данная приятная библиотечка действительно делает проще, сокращая объем рутинного кода, который постоянно повторяется.
    Много примеров и доков можно найти на домашней страничке проекта.

    Заключение

    В заключение хочется добавить интересный момент, который я заметил на недели: когда вы объявляете тег <uses-permission>, то описывать его нужно ДО тега application, иначе права не будут применены к приложению. По крайней мере у меня так было трижды, что говорит о неслучайности данного момента. Вот так, будьте внимательны!

    Как обычно все предложения и вопросы пишем в личку.
    Кто использовал данную библиотечку описывайте свой опыт, будет всем хорошо.

    Также прощу выбрать какой топик будет интересно прочитать первее:
    1) Авторизация Вконтакте через Android: публикация записи на стену.
    2) Процессы и потоки в Андроид: пишем AsyncTask правильно.
    3) Собираем полноценное приложение вместе с Scripting Layer for Android (SL4A) code.google.com/p/android-scripting
    4) Ваш вариант.
    Поделиться публикацией

    Комментарии 40

      +1
      хотелось бы прочитать про 3.
        0
        Учтем:)
        0
        >Также прощу выбрать какой топик будет интересно прочитать:
        — Пишите все, зачем спрашивать? :-)
          0
          На все времени не хватает, а один интересный можно будет написать. Сам же знаешь какого это:)
            0
            Тогда так:
            1) В принципе полезно, но аудитория потенциально в основном только русскоязычная.
            2) AsyncTask — тема избитая, если есть какие-то свежие идеи — пишите.
            3) Лично меня вообще не интересует.
              0
              1) Просто пару классов улучшающих жизнь. Кому-то потом в поиске будет попроще.
              2) Избитая, вот только не все понимают принципы работы потоков в Андроид и собственно как написать правильно асинктаск.
              3) Впринципе, меня тоже, но я эту штуку копал и apk-шку собирал. Ради интереса. Может быть полезна любителям Питона, как я:) либо тем, кому интересен скриптинг под дроид.
                0
                >2) Избитая, вот только не все понимают принципы работы потоков в Андроид и собственно как написать правильно асинктаск.
                — Ну вот тогда напиши и посмотрим, сколько не понимающих.

                Вообще вроде же по размеру не такие и большие статьи должны быть, ну разве что про скриптинг побольше :-)
                  0
                  Ну первая маленькая. Вторая большая. Хочется затронуть часть документации с сайта. Там есть очень полезных два принципа + добавить пример асинктаска.
                  Третья впринципе как раз небольшая, ибо тоже все довольно просто.

                  Я понял, что писать все:) Ок:)
                  Просто приоритет хотелось бы для себя понять.
          +1
          Многие вещи данная приятная библиотечка действительно делает проще
          А добавляет ли она тормозов?
            0
            В каком плане?
            В плане работы приложения?
              0
              Вообще, в плане времени компиляции тоже.
                0
                Либа времени компиляции. Написал код и запускаю сразу после Ctrl-S. Мгновенно все. Вообщем, мне понравилось, особенно после обновления инструментария, когда эмулятор стал летать прям(ладно, траблы тоже были после обновлений).

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

                Теперь можно и TDD юзать во всю, по крайней мере на том, что есть при установке SDK и Eclipse.
                  0
                  >Либа времени компиляции.
                  — Да, но при помощи ява-аннотаций изменяется основной код, что и может добавить тормозов на стадии компиляции. Собственно, потому и спросил. Сам знаешь насколько лишняя секунда тормозит процесс отладки в целом. Инструменты сам сижу обновляю сейчас, посмотрим насколько улучшится ситуация.
                    0
                    Да, знаю. У меня время никак не сказалось, на проекте крупном может и скажется.

                    Ну тебя должно приятно удивить время старта и запуска эмулятора с нуля:)
                      0
                      Если бы для 3+ запускался также как 2.1 к примеру, это было бы уже круто :-)
            +2
            На самом деле это все костыли, читабельность напрямую это не увеличивает. Если вы уже долгое время работаете, то определенные куски кода просто не замечаете, так как они типичны и смотрите только на доступ к ресурсу или другой важной части. Как показывает практика, любые библиотеки которые осуществляют связывание или делают визуальное упрощение тянут за собой кучу сгенерированного кода, следовательно увеличивает время компиляции.
              0
              Согласен, особого выигрыша данная библиотека не дает, слушателей, например, я сам уже давно описываю прямо в XML.
                0
                Не согласен. Проще пару строк добавить, чем кучу связанного рутинного кода, хоть и вынесенного в методы. Если есть неплохие тулзы, то можно(а порой и нужно) их использовать, упрощая себе жизнь. Мы люди, а не дроиды:)

                Java — отличный язык, но порой через чур многословен в некоторых аспектах, потому появляются такие штуки.

                А программисту важно быстро прочесть код, исправить что-то или добавить в нужное место новый блок(простое сопровождение)

                Время компиляции тут если и увеличилось, но настолько, что врят ли заметно.

                Дальше спорить не буду, ибо просто описывал опыт и впечатления от использования в одном проекте и мнения всегда разные. Кому-то хорошо, кому-то нет.
                +1
                Хотелось бы про Fragments API:)
                  0
                  Эмм, мне тоже хочется покопать в эту сторону, но смущает, что это только под 3.х версии, хоть и есть Compability Library.
                    +1
                    Согласен, без Compability Library смысла было бы в разы меньше. А так хочется чтоб приложения под 2.х планшеты прилично выглядели, но из за проекта времени нет разобраться.
                      0
                      Прилично в плане внешнего вида? Так есть же квалификаторы ресурсов -xlarge, xhdpi.

                      Вообще, штука приятнее и более модульная(я про фрагменты) из моего беглого взгляда на них.
                      И вообще непонятно, зачем делать отдельные ветки фреймворка для планшетов и смартов. В версии 3.х много вкусного(те же USB), а чтобы их юзать нужна какая-то хрень отдельная. Из-за нее и приложение станет больше, более чем уверен и глюков насобираешь.

                      p.s. я смотрю, ты и на выходных работаешь:(
                        0
                        Ну если судить по слухам про Android 4.0 и ситуацию с очень частыми выходами новых версий ОС, то отдельная ветка для планшетов не кажется таким уж бессмысленным ходом со стороны Google. Про ресурсы то и так понятно, но на сколько я представляю Fragments API предоставляет гораздо более удобные инструменты организации интерфейса чем стандартные API и не только для планшетов.
                        По поводу размера приложения согласен но никуда не денешься от этого, к тому же по сравнению с размерами приложений для iOS все не так уж страшно)

                        p.s. Сегодня, к сожалению, да(
                          0
                          А что там за служи про 4.0?
                          Тут доку читать всю не успеваешь по вторым версиям, а уже служи про 4.0:)
                            0
                            Ну что на аппаратах хардварных кнопок не останется)
                              0
                              Ну вообще! Не трогать «Home», «Menu», «Back»! Это святое.
                                0
                                Согласен с вами, на планшетах их уже нет, так что надежды мало:(
                  0
                  Спасибо. Почитал бы про пункты 1), но добавил бы туда Facebook. Вот есть API у него, на Git лежит пример, но он не всегда работает, я долгое время выяснял почему. Был бы не против увидеть статью про кастомизацию разных контролов.
                    0
                    Всмысле не работает? Я его использовал в реальном проекте — нареканий ноль, все работает замечательно.

                    Пожелания по статьи учту, спасибо:)
                      0
                      А пункт №1 могу тогда добавить и твиттер:)
                        0
                        А Twitter я сам описывал тут. Так и попал на хабр.
                    0
                    «AsyncTask, AsyncTask!» — кричала ликующая толпа в предвкушении новых зрелищ.
                    Заранее спасибо.
                      0
                      ок) 2 голоса за асинктаск уже)
                        –1
                        Беда в том, что завтра я буду применять его на работе. Впервые. Если вы поделитесь опытом в виде ссылок на хорошие ресурсы по теории, я вас расцелую! Ну, или плюсану карму — на хабре это ж больше принято? :D
                          0
                          На самом деле этого достаточно — developer.android.com/reference/android/os/AsyncTask.html, но некоторые особенности нужно разъяснить
                          • НЛО прилетело и опубликовало эту надпись здесь
                              0
                              Согласен, о чудесная, членораздающая машина — доков в основном хватает. По AsyncTask — уж точно, это оказалось довольно плевое дело. Но 99% — это слишком. Кроме багов, в доках хватает еще и недокументированных функций.

                              Теперь интересно, о каких особенностях нам расскажет автор.
                              • НЛО прилетело и опубликовало эту надпись здесь
                        0
                        Если можно, то сначала 3)
                          0
                          А кому-нибудь интересно более подробно про Android Annotations? Проек развивается. Там изумительная работа с потоками. Можно смело забывать про ASyncTask

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

                          Самое читаемое