Pull to refresh

Comments 36

приходилось делать одну и туже роботу

Простите, что придираюсь, но как-же повторное использование кода?
Разве не предполагается, что один раз решив какую-то задачу в следующий вы будете использовать тоже самое уже готовое решение?
Мне кажется у любого разработчика со временем появляется свой «Droidutils», который состоит из универсальных решений созданных ранее.
Проблема Java в том, что этот «свой Droidutils» нельзя свести до уровня header-only библиотеки, нужно таскать в проект дополнительные jar'ы (которые сперва нужно собрать), плюс порой отдавать клиентам полный код (что вредно с точки зрения трат времени на code review).

имхо, иногда лучше иметь свою библиотеку в виде разрозненных .java в выделенном неймспейсе, иногда лучше использовать Apache'вские либы, и… иногда стоит махнуть рукой и взять чужой DroidUtils, раз в нем есть именно то, что нужно ).
Да они хорошие, но хотелось сделать что-то подобное самому, плюс это интересный опыт.
У меня стойкое впечатление, что Droidutils почти полностью повторяет Volley, который весь из себя такой рекомендованный Google, активно форсируется на всяких I/O и т.д.
Мне кажется, ваш кастомный семафор будет работать неправильно. Например, после проверки наличия таска в мапе он может быть туда добавлен или удален из другого потока.
if (!mRunningTask.containsKey(taskTag)) {
    semaphore = new Semaphore(1);
} else {
    semaphore = mRunningTask.get(taskTag);
}
semaphore.acquire();
mRunningTask.put(taskTag, semaphore);

А кроме того, сам HashMap не потоко-безопасен.
Вы правы по поводу не потоко-безопасной HashMap, нужно пофиксить.
Я немного отстал и пока пишу json парсеры вручную для каждого класса. Скажите, пожалуйста, использование подобных библиотек для парсинга не сильно тормозит работу приложения? Ну то есть понятно, что, наверное, в какой-то степени тормозит, но критично ли это?
Тормозит, так как там рефлексия, но вы не заметите разницу.
Так что смело можете использовать. А скорость и удобство при разработке вы почувствуете.
смотря как парсить… если сразу пихать данные в объект, по получается быстрее, чем парсить в мапу
Я когда то сам вручную парсил и скажу что это очень затратно по времени. Даже если вы потеряете немного в скорости из-за рефлексии, это намного практичнее использовать готовые парсеры, либо напишите свой.
JSON — Gson
Http — OkHttp + Retrofit или свой слой с OkHttp
Многопоточность — PriorityJobQueue, RxJava, но тут у меня свое

Не знаю как с многопоточностью, но для роботы с http не советую эту библиотеку. Она использует сервис для выполнения работы, а этот сервис использует биндинг для подключения к Activity, таким образом они могут синхронно общаться. Что не очень то и удобно для выполнения запросов. Когда мы закрываем Activity, она отключается от сервиса, в этот момент мы можем выполнять запрос, результаты которого мы не узнаем.
Асинхронно они общаются.
Там все выполняется асинхронно, результат кидается через callback.
Когда activity закрывается, кто вам мешает остановить запрос?
Если не верите на слово, вот тут рассмотрены три паттерна, robospice реализует паттерн A, хотя при необходимости использование можно упростить до обычного callback общения.

Есть ситуации когда нужно, что бы запрос выполнился до конца и результат записался в базу или кеш, независимо от того закрывается activity или нет.
Да, согласен, и это делается.
Я пользуюсь RoboSpice и у меня не зависимо от состояния активити все сохраняется в базу.
Асинхронно.
Можно использовать кэшируемые запросы, тогда при следующем запросе данные сразу загрузятся. Но это не очень безопасно.
Вариант еще написать менеджер запросов, который будет отслеживать доставку ответов.
А чем не безопасны кэшируемые запросы?
Просто нужно правильно задавать ключ для кэша.
Ключ где то хранить надо :) Тут от требований к безопасности зависит.
Ключ генерируется определенным образом для получения нужного кэшированного запроса, его нигде хранить не надо.
Кэш хранится в sqlitе базе, к которой есть доступ только у вашего приложения.
Если очень хочется, то и генерацию можно подсмотреть. 100% безопасный случай — ничего не хранить на устройстве.
если следовать вашей логике то и не передавать ничего
Такой кейс — приложение, с аккаунтами пользователя, у каждого аккаунта сотни тысяч на счету. Будете ли вы хранить эти данные в кэше на Android-устройстве?
Так у меня в предложении про безопасность и кэшируемые запросы. И про них мы вроде в ветке говорим? :)
да, верно, я просто отредактировал по невнимательности, обратно вернуть не смог.
Если по сабжу, коли хранить данные в принципе не безопасно, то речь о кэше даже и заводить не стоит :)
Зачем вообще создавать DroidUtils, когда есть Retrofit, JobQueue, GSON и другие проверенные библиотеки.
только ради опыта и интереса способов реализации
Ну тогда вредил стоит писать об этом на Хабре
по вашей логике половину статей на хабре можно было не писать
Sign up to leave a comment.

Articles