Comments 34
Мда, на что только люди не идут, чтобы не написать пару лишних строчек кода.
А вообще, реклама, это конечно хорошо, но хотелось бы, чтобы статья объясняла, что же на самом деле происходит under the hood. Ну вот, например, @Background. Каким образом он реализуется? Каким образом вызывает UIThread? Будет ли он вызываться после пересоздания activity? А так всё весьма поверхностно.
А вообще, реклама, это конечно хорошо, но хотелось бы, чтобы статья объясняла, что же на самом деле происходит under the hood. Ну вот, например, @Background. Каким образом он реализуется? Каким образом вызывает UIThread? Будет ли он вызываться после пересоздания activity? А так всё весьма поверхностно.
+2
реклама? это забугорная либа.
про потоки можно посмотреть с легкостью, скомпилив проект и посмотрев, что она сгенерирует. Реализовано очень хорошо и стабильно. Больше 20 одновременых нитей в проекте запускалось и никаких падений и nullpointer'ов при поворотах и экстренном закрытии.
Ответ — нет, при пересоздании не переаттачится. Это минус, но не для всех задач
про потоки можно посмотреть с легкостью, скомпилив проект и посмотрев, что она сгенерирует. Реализовано очень хорошо и стабильно. Больше 20 одновременых нитей в проекте запускалось и никаких падений и nullpointer'ов при поворотах и экстренном закрытии.
Ответ — нет, при пересоздании не переаттачится. Это минус, но не для всех задач
+1
Посмотреть можно и в исходниках библиотеки. Но, все таки, раз уж вы пишите обзор, то простая копипаста с вики проекта — не самая лучшая затея. Вики там и так очень большой и исчерпывающий.
А многопоточность, мне кажется, реализована самым простым и действенным образом. При этом повороты экрана, как и раньше, придется обрабатывать самому.
А многопоточность, мне кажется, реализована самым простым и действенным образом. При этом повороты экрана, как и раньше, придется обрабатывать самому.
+2
Ну вообще то, по сравнению с Thread/Handler сокращение заметное. Особенно учитывая что хэндлер по хорошему нужно оформлять как статик класс и добавлять в него WeakReference на активити.
Loaders конечно не заменит, но для мелочевки сильно сэкономит время, а код упростит. ИМХО.
Loaders конечно не заменит, но для мелочевки сильно сэкономит время, а код упростит. ИМХО.
0
Спасибо за статью,
А есть у кого-нибудь положительный опыт использования этой библиотеки в комбинации с различными build-тулами — Ant, Maven, Gradle?
А есть у кого-нибудь положительный опыт использования этой библиотеки в комбинации с различными build-тулами — Ant, Maven, Gradle?
+1
Какое то сомнительное сокращение кода, выглядит это непривычно. Кто пользовался?
0
Синтетические примеры — это всегда хорошо и красиво. Самый главный вопрос, работает ли это где-либо вне Activity или Fragment? Простейший пример: «паттерн» ViewHolder для вьюшек элементов списка?
Код работы с вью и потоками в Activity часто уходит во всевозможные Helper-ы, ViewHolder-ы и прочие Action-ы, я правильно понимаю, что в этом случае аннотации нам не помогут?
class ViewHolder {
private final View title;
private final View subTitle;
public ViewHolder(Context context, View view) {
title = view.findViewById(R.id.some_id);
subTitle = view.findViewById(R.id.some_other_id);
}
public void setData(SomeData data) {
doSomething();
}
}
Код работы с вью и потоками в Activity часто уходит во всевозможные Helper-ы, ViewHolder-ы и прочие Action-ы, я правильно понимаю, что в этом случае аннотации нам не помогут?
0
Хотелось бы выяснить, во что в итоге заворачиваются @Background и @UiThread, и могут ли они работать не в Activity.
-1
Могут работать и в Activity, и во Fragment, и в своих View, и просто в отдельных классах.
А как работают смотрите ниже
А как работают смотрите ниже
0
Сгенерированный код примера работы с потоками, который в статье:
где
а тут код BackGroundExecutor
@Override
public void backgroundWork() {
BackgroundExecutor.execute(new Runnable() {
@Override
public void run() {
try {
TestActivity_.super.backgroundWork();
} catch (RuntimeException e) {
Log.e("TestActivity_", "A runtime exception was thrown while executing code in a runnable", e);
}
}
}
);
@Override
public void publishProgress(final int progress) {
handler_.post(new Runnable() {
@Override
public void run() {
try {
TestActivity_.super.publishProgress(progress);
} catch (RuntimeException e) {
Log.e("TestActivity_", "A runtime exception was thrown while executing code in a runnable", e);
}
}
}
);
}
@Override
public void onBGTaskFinish(final String resultText) {
handler_.post(new Runnable() {
@Override
public void run() {
try {
TestActivity_.super.onBGTaskFinish(resultText);
} catch (RuntimeException e) {
Log.e("TestActivity_", "A runtime exception was thrown while executing code in a runnable", e);
}
}
}
);
}
где
handler_ = new Handler();
а тут код BackGroundExecutor
0
А зачем ставить минусы? Если вам просто не нравится эта библиотека или подход к разработке — делайте, как нравится, не гневайтесь на тех, кто предпочитает другие пути
-3
Не совсем понял связь картинки с содержанием поста. Это для создания хорошего настроения у читателей перед прочтением?
+1
UFO just landed and posted this here
1.
2. как указал автор, эта аннотация имеет необязательный аргумент типа int, позволяющий задать id искомого
@ViewById
.2. как указал автор, эта аннотация имеет необязательный аргумент типа int, позволяющий задать id искомого
View
.0
UFO just landed and posted this here
На мой взгляд, разрешать экземпляры
А её лучше либо отделять либо вообще избавляться. так как она затрудняет чтение кода ответственного за бизнес-логику.
View
по id, как вообщем и распределять программу по потокам (AsyncTask), пробрасывать объекты через всю иерархию вызовов, и т.п. — это сквозная логика. А её лучше либо отделять либо вообще избавляться. так как она затрудняет чтение кода ответственного за бизнес-логику.
0
Интересная библиотека.
Немного смутила ситуация с инъекциями. Например тот же
Она не лишена недостатков, однако при осторожном использовании позволит избавится от бойлерплейтного кода который уже так надоел мне.
Немного смутила ситуация с инъекциями. Например тот же
@ViewById
задекларированный в классе помеченным @EBean
незаметно потащит за собой весь контекст, что может привести к утечке памяти при потери бдительности (а библиотека как раз этому способствует).Она не лишена недостатков, однако при осторожном использовании позволит избавится от бойлерплейтного кода который уже так надоел мне.
+1
а я влюбился в Android — query
впервые среди подобных утилит увидел простой и чистый код без изъебств, 60 килобайт, никаких зависимостей, те же плюшки с сокращением кода + еще с пол-сотни мегаюзабельных утилит из коробки.
Вобщем что-то вроде jquery для веб или codeigniter для пхп — только для андроид
впервые среди подобных утилит увидел простой и чистый код без изъебств, 60 килобайт, никаких зависимостей, те же плюшки с сокращением кода + еще с пол-сотни мегаюзабельных утилит из коробки.
Вобщем что-то вроде jquery для веб или codeigniter для пхп — только для андроид
+4
Не нравятся такого типа либки, которые сами код генерируют и которым нужны всякие символы подчеркивания.
Конечно это работает быстрее чем плюшки из Roboguice, но код не становится чище
Конечно это работает быстрее чем плюшки из Roboguice, но код не становится чище
+1
К сожалению RoboGuice заставляет производительность плакать. Из-за него время запуска приложения может достигать секунд.
Особенно печально это при обработке широковещательных сообщений. Что-бы запустить обработку сего сообщения на незапущенном приложении, необходимо создать объект
Особенно печально это при обработке широковещательных сообщений. Что-бы запустить обработку сего сообщения на незапущенном приложении, необходимо создать объект
Application
, который потянет за собой инициализацию RoboGuice. Казалось бы, подумаешь — немного батарейки сожрет и все. А если представить что это сообщение обработка клика по виджету?0
Подскажите кто то пробовал в продакшене Butter Knife? Решений на подобие Roboguice уже несколько, хотелось бы узнать мнение тех кто может сравнивал и знает плюсы и минусы этих либ.
0
Sign up to leave a comment.
AndroidAnnotations — упрощаем и укорачиваем код без вреда для здоровья проекта (I часть)