- PVSM.RU - https://www.pvsm.ru -
[1]Привет, меня зовут Юра. И я, как и многие из вас, программист. Как известно, программисты — это не просто разработчики ПО, но создатели. Но, к сожалению, в повседневной работе сложно создавать что-то новое (особенно, когда ты занят мобильной разработкой). И это часто порождает желание собрать своего Франкенштейна (ну или велосипед, если вам так хочется), хотя бы в свободное время. Например, мне всегда хотелось сделать своего Франкенштейна, который будет выполнять за меня основную рутинную работу в Android-приложении.
И вот у меня недавно, наконец, нашлось свободное время на это дело (прим. автора: здесь можно просто за меня порадоваться)! Почитав разные статьи о том, что сейчас модно, или стало модным ещё много лет назад, я собрал для себя примерный список того, из чего будет состоять мой друг. И вот чему он у меня пока научился:
Сколько разных элементов мне пришлось свалить в одну кучу, чтоб мой монстрик, по имени FunLib [1] ожил! Тут собрались такие звёзды, как retrofit, eventbus, jobqueue… Но давайте по-порядку! Итак, кто за что отвечает в моём детище:
В интернет мы ходим, используя Retrofit [2]+OkHttp [3]. Это позволяет делать всю работу быстро, аккуратно и при поддержке большого комьюнити. Согласитесь, очень удобно делать запрос на сервис примерно таким способом:
public interface GithubApi {
@GET("/search/repositories?sort=stars&order=desc")
SearchResult search(@Query("q") String query);
}
И ведь как круто получается, прям по-евангелистки! Ведь разработка реально ведётся не на уровне реализации, а, буквально, на уровне интерфейса! Вообще, очень много чего можно добавить в запрос, по разному настроить его. Но т.к. это не сама суть статьи, оставлю это на ваше самостоятельное изучение. Ну или было бы здорово, если бы кто-нибудь написал, как он круто использует эти библиотеки, особенно, если его ходы не тривиальны и не освещены в офф. гайде [2].
За память у него отвечает ORMLite [4]. Как говорится, на вкус и цвет все фломастеры разные. Мне это решение нравится больше всего. Особенно, к плюсам этой библиотеки я отношу вот что:
Здесь, как обычно — аннотируем нужные классы и поля как @DatabaseTable
и @DatabaseField
, соответственно. После чего спокойно можем сложить, или, если надо, достать, данные в БД:
private void saveRepositories(List<Repository> repositories) throws SQLException {
Dao<User, ?> userDao = getDbHelper().getDao(User.class);
Dao<Repository, ?> repositoryDao = getDbHelper().getDao(Repository.class);
for (Repository repository : repositories) {
userDao.createOrUpdate(repository.getOwner());
repositoryDao.createOrUpdate(repository);
}
}
PS: к сожалению, пока FunLib не умеет удобно нотифаить лоадеры по URI… Да и его активити с фрагментами не предоставляют функционало для удобной работы с лоадерами, но всё в ваших руках! Пулл-рекввесты ждут вас. Ну или ждите, пока я это сделаю :P
Для этого немаловажного процесса был выбран инструмент под названием Priority Job Queue [5]. Почему же мы не сделали свой собственный сервис? Да всё просто — мне было интересно использовать эту библиотеку =) Да и манифест остаётся чист. И, что не мало важно, это решение довольноприемлемо аккуратно вписывается в нашу Центральную Нервную Систему(чуть ниже про неё сказано). Но мы с FunLib сели, подумали, и решили, что тот Job, от которого команда Path предлагает нам наследоваться, слишком монструозен. Мне будет тяжело давать моему малышу какие-нибудь команды. Ну или ему будет не так просто их понять. Поэтому был сделан карапуз по имени FunJob
, который умеет просто выполнить нужную нам работу в методе public abstract T doJob() throws Throwable
.
public class SearchJob extends FunJob<List<Repository>> {
private String mQuery;
public SearchJob(int id, String query) {
super(id);
mQuery = query;
}
@Override
public List<Repository> doJob() throws Throwable {
SearchResult searchResult = ((GithubApi) getApi()).search(mQuery);
List<Repository> repositories = searchResult.getRepositories();
return repositories;
}
}
Для такой важной задачи, как доставка БД, интернета, и прочей информации в
А для отправки команды от мозгов к телу была использована штука под названием EvenBus [9]. Изначально хотел использовать Otto [10], но, по непонятным причинам FunLib его невзлюбил, и я быстро отказался от него. Ну ничего — EventBus тоже отлично справляется со своей задачей! Тело всегда вовремя получает нужные команды!
На этом пока я решил сделать привал, завершить свой рассказ и получить от вас фитбэк. И уже после этого я продолжу дальше развивать моего кроху.
В примере [11] вы можете отчётливо увидеть, как управлять работой FunLib — всего-то нужно:
Возможно, прочитав про лоадеры, вы подумаете, что я, наконец, решу прикрутить к приложению ContentProvider. Но нет, этого делать я не планирую, т.к. думаю не спроста в офф. гайде написано [12]: You don't need to develop your own provider if you don't intend to share your data with other applications. В моей практике ещё не приходилось делать такого приложения, которые бы предоставляло данные другим приложениям. И не надо из-за этого кидать в меня помидорами! Всем нам разные задачи попадаются.
Так же пока печалит то, что нужно самостоятельно следить за тем, какой ID для FunJob был выставлен. Но ничего — это будет исправлено, и это станет очередной вкусняшкой!
Кто пропустил ссылку на репозиторий, ловите: https://github.com/senneco/FunLib [1]
Встретимся в комментах и в пулл-реквестах :D
Автор: senneco
Источник [13]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/news/61315
Ссылки в тексте:
[1] Image: https://github.com/senneco/FunLib
[2] Retrofit: http://square.github.io/retrofit/
[3] OkHttp: http://square.github.io/okhttp/
[4] ORMLite: http://ormlite.com/
[5] Priority Job Queue: https://github.com/path/android-priority-jobqueue
[6] мозг: http://www.braintools.ru
[7] Dagger: http://square.github.io/dagger/
[8] Dependency Injector: http://ru.wikipedia.org/wiki/%D0%92%D0%BD%D0%B5%D0%B4%D1%80%D0%B5%D0%BD%D0%B8%D0%B5_%D0%B7%D0%B0%D0%B2%D0%B8%D1%81%D0%B8%D0%BC%D0%BE%D1%81%D1%82%D0%B8
[9] EvenBus: https://github.com/greenrobot/EventBus
[10] Otto: http://square.github.io/otto/
[11] примере: https://github.com/senneco/FunLib/tree/master/FunLibSample/src/main
[12] написано: http://developer.android.com/intl/ru/guide/topics/providers/content-providers.html
[13] Источник: http://habrahabr.ru/post/224977/
Нажмите здесь для печати.