• Зачем нужен Dependency Injection в Android разработке?

    artemgapchenko
    @artemgapchenko
    Начать неплохо бы с понимания того, что такое DI. Обратимся к википедии:

    Внедрение зависимости (англ. Dependency injection, DI) — процесс предоставления внешней зависимости программному компоненту.

    Если выражаться не канцеляритом, а обычным русским языком, то DI - это когда вы своему компоненту (например, классу) предоставляете нужные для него зависимости извне, а не создаете их сами в конструкторе, или через инициализацию в месте объявления поля. То есть не так:

    public class Api {
    	....
    	private final HttpClient client = new OkClient();
    }

    А, например, так:

    public class Api {
    	....
    	private final HttpClient client;
    
    	public Api(@NonNull HttpClient client) {
    		this.client = client;
    	}
    }


    И что нам это даёт?

    Ну, очевидно, нам теперь проще менять зависимости. Нужна вам другая реализация абстрактного класса HttpClient - взяли, и передали её через конструктор, или через метод-setter. В случае с первым куском кода, вам пришлось бы ещё и класс Api переписывать, что в случаях, отличных от тривиальных, может привести к ошибкам. Получается, что ваш класс теперь закрыт от изменений (смотрим Open/Closed Principle).

    Окей, а на практике-то какие бенефиты?

    Во-первых, вы теперь можете написать инициализацию вашей программы через конфигурационные файлы. Скажем, на старте будет читаться простенький текстовый файл, который определяет, какой httpclient использовать, какие настройки доступа к бд применять и так далее, и, исходя из этого, будут определяться зависимости.
    Во-вторых, вам теперь существенно проще писать тесты. Написали вы, скажем, какой-нибудь парсер, который принимает InputStream, содержащий в себе данные json-объекта, как-то хитро его парсит, и выдаёт вам объект вашей бизнес-модели. В приложении этот парсер будет принимать на вход реализацию InputStream'а, которая берёт данные из сети, а в тестах - реализацию, которая просто читает файл с диска (потому что тесты должны выполняться часто и быстро, и ваша задача в тесте - протестировать ваш парсер, а не скорость сетевого соединения).

    Вот, в общем-то, и всё. А Dagger - это просто библиотека, которая автоматизирует ручное внедрение зависимостей, равно как и другие DI-библиотеки.

    P.S. В некоторых случаях чрезмерное увлечение DI может привести к нежелательным эффектам, вроде чрезмерного усложнения кода, поэтому внедряйте аккуратно. Понимание приходит с опытом.
    Ответ написан
    Комментировать
  • Можно ли вызывать AlertDialog из сервиса?

    @Copperfield
    Android dude
    Верен. BroadcastReceiver можно заменить на LocalBroadcastManager, или еще проще на EventBus
    Ответ написан
    5 комментариев
  • На каких резистрах собрать нагреватель?

    @Nikolay45
    В бесперебойниках стоят приличные резисторы на 5-30 Вт для самодиагностики АКБ. Ввиду высокой стоимости новых АКБ, по сравнению с общей ценой старого бесперебойника, последние часто выбрасывают. Я так собрал приличную коллекцию нагрузочных сопротивлений. Удачи.
    Ответ написан
    Комментировать
  • Идеи приложений для начинающего разработчика под Android?

    sintez
    @sintez
    Например, анализ списка вызовов и смс и построение чартов на экране, где показывается кому чаще всего звоню-пишу.
    Далее можно усложнять - сохранять эти чарты в виде картинки и постить на стену/твит/инстаграмм/оправить другу по емейл.
    Сохранение всей этой статистики в локальной БД.
    Бэкап данных статистики в облако - например экспортить данные в json и класть куда-нибудь на Яндекс. Диск. Соответственно и возможность восстановления этой статистики.
    Бэкграунд-задачка которая в фоне смотрит обновления списка вызовов и СМС, пересчитывает статистику и складывает в базу.
    Показывать всякие нотификашки, например после успешного обновления статистики в фоне напистаь об этом.

    Этого уже будет достаточно, чтобы изучить приличный кусок АПИ Андроида =)
    Ответ написан
    Комментировать
  • Как запустить вентилятор через Arduino?

    stasuss
    @stasuss
    быдлокодер со стажем
    это ж полевик! его нельзя подключать к ноге контроллера напрямую, нужен второй транзистор обычный.
    easyelectronics.ru/upravlenie-moshhnoj-nagruzkoj-p...
    Ответ написан
    2 комментария
  • Существует ли IDE для Android-приложений для ДЕТЕЙ?

    @aol-nnov
    такой? :)
    если из этого вырос, то только Android Studio, только хардкор!!1
    Ответ написан
    1 комментарий
  • Какие бывают Android-разработчики?

    gadfi
    @gadfi
    https://gamega.org
    . Пока для меня эта технология делится на разработку UI, написание логики на Java, написание нативного кода на C/C++.

    не делятся.
    узкие специальности как и везде прикладном софте ─ обработка звука/видио, voip телфония и тд. Крутая контора может себе позволить крутого спеца в узкой технологии, но чтобы стать крутым спецом нужно все сотальное знать хотя бы на уровне мидла.
    Да бывает что узкого спеца перетягивают из другой технологии, например та же обработка звука (просто пример), человек богоподобен в алгоритмах работы со звуком и пилит только это ... но это редкость. Да, специалсизация несомненно имеет место быть ─ кто то любит больше делать крутую анимацию, кто то пишет классные rest клиенты.... но при этом разбираются во всем.
    Архитектура android пока не позволяет ити по пути java ee, где куча модулей, и человек который собаку съел на оптимизации hibirnate, который легким движением бубна увеличивает скорость работы базы в разы, может заниматься только этим.
    Посмотрите на этого парня, https://github.com/JakeWharton он пишет узкоспециализировные библиотеки, но покажите мне того кто назовет его узким специалистом .
    Ответ написан
    Комментировать
  • Как правильно написать техническое задание для разработки мобильного приложения?

    zo0m
    @zo0m
    full stack developer
    Я начинаю обычно с набросков экранов рукой на бумаге,
    потом когда понимаю, что хочу чуть лучше, то делаю мок в caccoo: prntscr.com/8cxsbr (вот такой например)
    дальше можно эти экраны по одному всунуть еще в вордовский документ и описать подробнее
    в большинстве случаев, мне бы такого хватило с головой что-бы понять о чем приложение
    Ответ написан
    Комментировать
  • Какие есть Android приложения с открытым кодом, позволяющие использовать собственный сервер вместо облака и шифрующие информацию при этом?

    074909
    @074909
    группа медленного нереагирования
    https://ru.wikipedia.org/wiki/OwnCloud
    https://duckduckgo.com/?q=owncloud+site%3Ahabrahabr.ru
    ownCloud — это Свободное и открытое веб-приложение для синхронизации данных, расшаривания файлов и удалённого хранения документов в «облаке».

    Доступны десктопные клиенты для прямой синхронизации данных с ПК, работающих под управлением Windows, Mac OS или Linux, а также мобильных устройств на iOS и Android. Что еще более важно, сохраненные данные доступны с помощью веб-интерфейса OwnCloud в любом веб-браузере.

    Возможности
    Хранение файлов с использованием обычных структур каталогов, или с использованием WebDAV
    Криптография
    Синхронизация между клиентами под управлением Windows (Windows XP, Vista, 7 и 8), Mac OS X (10.6 и новее) или Linux
    Календарь (также как CalDAV)
    Планировщик задач
    Адресная книга (также как CardDAV)
    Потоковое мультимедиа (используется Ampache)
    Администрирование пользователей и групп (с использованием OpenID или LDAP)
    Расшаривание контента между группами или используя публичные URL
    Онлайн текстовый редактор с подсветкой синтаксиса и сворачиванием
    Закладки
    Механизм сокращения URL
    Фотогалерея
    Просмотрщик PDF (используется PDF.js)
    Просмотрщик ODF файлов (.odt, .odp, .ods)
    Модуль логирования
    Ответ написан
    Комментировать
  • Как изменить стандартный шаблон Диалога в Android?

    mbelskiy
    @mbelskiy
    Software Developer
    Ответ написан
    Комментировать
  • Как немного изменить шаблон проекта в AndroidStudio?

    Ewintory
    @Ewintory
    Java / Android developer
    Ваш вопрос сподвигнул разобраться :)
    Нашел два варианта на выбор. Файл открываете текстовым редактором, добавляете зависимость и сохраняете отдельно. Потом заменяете.

    1. Добавляем зависимость в
    {android-studio-location}\plugins\android\lib\templates\gradle-projects\NewAndroidModule\recipe.xml.ftl

    <recipe>
    
        <dependency mavenUrl="com.jakewharton:butterknife:6.1.0"/>
    
        <#if appCompat><dependency mavenUrl="com.android.support:appcompat-v7:${targetApi}.+"/></#if>
    ...
    </recipe>


    2. Либо добавляем зависимость сюда
    {android-studio-location}\plugins\android\lib\templates\gradle-projects\NewAndroidModule\root\build.gradle.ftl

    dependencies {
        <#if dependencyList?? >
        <#list dependencyList as dependency>
        compile '${dependency}'
        </#list>
        </#if>
        compile fileTree(dir: 'libs', include: ['*.jar'])
    <#if WearprojectName?has_content && NumberOfEnabledFormFactors?has_content && NumberOfEnabledFormFactors gt 1 && Wearincluded>
        wearApp project(':${WearprojectName}')
        compile 'com.google.android.gms:play-services:+'
    </#if>
        compile 'com.jakewharton:butterknife:6.1.0'
    }


    UPD: ВНИМАНИЕ, при обновлении до 1.2.2 вылетело такое сообщение, скорее всего из за этих изменений. Сообщение как раз ссылается на файл, который я изменил по первому пункту. Пришлось вернуть исходный файл.
    945944cb19564316879d41ead4def6eb.JPG
    Ответ написан
    1 комментарий
  • Как придумывать осмысленные имена для классов?

    suguby
    @suguby
    программист, python, django, mysql, git, hg, linux
    Очень хороший вопрос. На нейминг нужно осознанно тратить время, пробовать все возможные варианты. Хорошо названные классы и переменные - один из признаков чистого кода. Я именно так и поступаю - гуглотранслейчу русское и пробую на "вкус" :) лучше кстати пользоваться www.multitran.ru - там есть отраслевой перевод
    Рекомендую к прочтению www.ozon.ru/context/detail/id/5011068 (в сети можно найти сканы) и вот это видео к просмотру https://moscowdjango.ru/meetup/26/how-to-name-vari...
    Ответ написан
    Комментировать
  • Как искать find пропуская некоторые директории?

    @Shetani
    find . -name "*.php" ! -path "./cache/*" ! -path "./crm/m_cache/*"
    Ответ написан
    Комментировать
  • Chrome или Firefox для веб разработки?

    aen
    @aen
    Keep calm and 'use strict';
    Сколько себя помню, я всегда пил кофе по утрам, но тут заметил, что на работе все пьют чай, аргументируя якобы более приятным вкусом и наличием ароматов, которых нет у кофе.

    Решил поинтересоваться у сообщества кто что пьет и почему? Что на ваш взгляд является более вкусным: чай или кофе?


    Надеюсь вы меня поняли. Пользуйтесь тем, что вам удобно и что решает ваши задачи.
    Ответ написан
    8 комментариев