Основы

Resources

Activities

Services&Broadcast Receivers

Handler&UI&Task

Content Providers

Fragments

Intents and Filters

Graphica

Сеть и Ретрофит

Examples

Яндекс.Метрика

ANDROID Основы

			
Организация Android
Логи и всплывающие сообщения
паттерны проектирования

Android Resources

Организация ресурсов Android
Анимация res/anim/.xml
Работа с файлами
XmlPullParser. Парсим XML

Android - Activities


Activities
ViewGroup (Layout)
OnClickListener
MenuInflater и xml-меню
Контекстное меню
Task
LayoutInflater
Списки, адаптеры
Диалоги
Поворот экрана
PreferenceActivity
Tab - вкладки.

Android - Services

Служба - это компонент, который работает в фоновом режиме для выполнения длительных операций без необходимости взаимодействия с пользователем и работает даже при уничтожении приложения. Служба может принимать два состояния -
developer.android.ru

Android - Broadcast Receivers

Широковещательные приемники просто реагируют на широковещательные сообщения - события или намерения из других приложений или системы.
BroadcastReceiver перехват намерений(сообщений)
BroadcastReceiver отправка намерений(сообщений)

Handler UI AsyncTask

	
Handler - это механизм, который позволяет работать с очередью сообщений. Только оригинальный поток, создавший view-компоненты, может взаимодействовать с ними и для этого используем Handler
 Есть еще такая проблема, что у каждого потока свой стек, поэтому может тупо не хватить оперативки. Например 1Мб стека * 1Млн потоко = 1Тб оперативки. Если 100кб стек, то 100Гб ОЗУ, что тоже не реально. Предельно 10кб стека, тогда 10Гб ОЗУ уйдет только на стек потоков. 10кб это уже предельный размер для стека, хватит лишь чтобы разместить массив на 2000 интов.


в linux есть переменная /proc/sys/kernel/thread-max она ограничивает максимальное количество потоков в системе.
На доступных мне машинах это значение варьируется от 80000 до 140000.

ExecutorService исполняет асинхронный код в одном или нескольких потоках. Создание инстанса ExecutorService'а делается либо вручную через конкретные имплементации (ScheduledThreadPoolExecutor или ThreadPoolExecutor), но проще будет использовать фабрики класса Executors. Например, если надо создать пул с 2мя потоками, то делается это так:
ExecutorService service = Executors.newFixedThreadPool(2);

Если требуется использовать кэширующий пул потоков, который создает потоки по мере необходимости, но переиспользует неактивные потоки (и подчищает потоки, которые были неактивные некоторое время), то это задается следующим образом:
ExecutorService service = Executors.newCachedThreadPool();

Теперь небольшой пример. Допустим, надо запустить какой-нибудь код асинхронно 10 раз. Основываясь на вышесказанном, код будет выглядеть так:
ExecutorService service = Executors.newCachedThreadPool();
for(int i = 0; i < 10; i++) {
 service.submit(new Runnable() {
  public void run() {
   // snip... piece of code
  }
 });
}

Метод submit также возвращает объект Future, который содержит информацию о статусе исполнения переданного Runnable или Callable (который может возвращать значение). Из него можно узнать выполнился ли переданный код успешно, или он еще выполняется. Вызов метода get на объекте Future возвратит значение, который возвращает Callable (или null, если используется Runnable). Метод имеет 2 checked-исключения: InterruptedException, который бросается, когда выполнение прервано через метод interrupt(), или ExecutionException если код в Runnable или Callable бросил RuntimeException, что решает проблему поддержки исключений между потоками.
Коструктор
Handler.Callback позволяет послылать отложенные сообщения и удаление из очереди.
Коструктор
Handler. Обработка Runnable
Существует еще пара способов выполнять Runnable в UI-потоке. Это методы: Activity.runOnUiThread(Runnable) View.post(Runnable) View.postDelayed(Runnable, long)
Конструкторы

AsyncTask

Это выполнение тяжелых задач и передача в UI-поток результатов работы без Handler и новых потоков
Методы
Конструкторы
Если мы повернем экран, Activity будет создано заново, все прошлые объекты будут потеряны. В том числе мы потеряем и ссылку на наш созданный AsyncTask. А сам AsyncTask будет работать со старым Activity и держать его в памяти, т.к. объект внутреннего класса (AsyncTask) содержит скрытую ссылку на объект внешнего класса (Activity).
Поворот экрана

Android - Content Providers

	

Content Providers это способ расшарить для общего пользования данные вашего приложения в виде базы данных. 
Content Providers реализован как подкласс класса ContentProvider и должен реализовать стандартный набор API, которые позволяют другим приложениям выполнять транзакции.
public class My Application extends ContentProvider {
}
При работе с провайдером используется Uri.
<content>://<authority>/<path>/<id>
Here is the detail of various parts of the URI −
Sr.No описание
1 content:// стандартное начало: //
2 authority Это указывает имя Content Providers, например контактов, браузера и т. Д. Имя базы. content://contacts/
3 path Это указывает тип данных, предоставляемых данным поставщиком. content://contacts/Cat
4 id Это указывает конкретную запрошенную запись. Например, если вы ищете контактный номер 5 в поставщике содержимого контактов, тогда URI будет выглядеть следующим образом: content://contacts/Cat/5
Создание контент-провайдера
Пример
developer.android.com
developer.android.com2

Android - Fragments

	
Фрагмент - это часть Activity, которая располагается в основном Activity и имеет свой lifecycle. 	

Конструктор

В основном фрагменты делятся на три типа:

Одиночные фрагменты для небольших экранных устройств
Фрагмент списка.Совместимо со всеми версиями андроид
Переходные фрагменты.Анимация
Также есть DialogFragment и PreferenceFragment на сайте startandroid

Android - Intents and Filters

	

Явные намерениия

Android Intent - объект для вызова компонентов Activity методом startActivity, BroadcastReceiver методом sendBroadcast(), Service методом startService (Intent) или bindService (Intent, ServiceConnection, int) для связи с фоновым сервисом, а также поставщиков контента Intent intent = new Intent(this, Two.class); startActivity(intent);
Sr.No Методы и описание
1 Context.startActivity() Object Intent передается this.метод для запуска нового действия (Activity) или получения существующей активности для создания чего-то нового.
2 Context.startService() Object Intent передает this.метод для запуска службы или доставки новых инструкций для текущей службы.
3 Context.sendBroadcast() Object Intent передает this.метод для доставки сообщения всем заинтересованным вещательным приемникам.

Неявные намерениия

При создании Intent мы используем не класс, как в явном намерении, а заполняем параметры action, data, category. Intent read1 = new Intent (); read1.setAction (android.content.Intent.ACTION_VIEW); read1.setData (ContactsContract.Contacts.CONTENT_URI); startActivity (READ1); Вышеуказанный код откроет контакты
action
data
category
Intent Filter
getIntent или универсальная активность
putExtras () и getExtras ()
startActivityForResult
Parcelable передача объектов с помощью Intent
Flags
Обратная связь с помощью PendingIntent

Graphica

		
		
Touch – обработка касания
MultiTouch – обработка множественных касаний
Canvas

Android - Advanced Concepts

	
					
	

Привет! В этой статье мы будем разбираться как работать с библиотекой Retrofit, которая призвана значительно сократить трудозатраты при работе с API веб-сервисов, а также напишем простой пример использования Retrofit 2 в тестовом приложении.


1.Retrofit. Что это?

Retrofit – это REST клиент для android и Java от компании Square. Он может относительно легко получать и разбирать JSON (или другие структуированные данные) через вебсервисы, использующие REST. В Retrofit для (де)сериализации данных используются конверторы, которые необходимо указывать вручную. Типичным  конвертором для JSON формата является библиотека GSon, но вы можете воспользоваться кастомным конвертером для обработки XML или прочих протоколов. Для HTTP запросов Retrofit использует OkHttp библиотеку.

Вы можете создать Java объекты основанные на JSON через сервис по ссылке http://www.jsonschema2pojo.org/

Для работы с Retrofit нам потребуется выполнить три шага:

1)Создать класс модели, который будет перегоняться в JSON

2)Создать интерфейс, определяющий возможные HTTP Операции (API)

3)Настроить Retrofit с помощью Retrofit.Builder класса.

Сейчас наверняка вам ничего не понятно, но далее на примерах всё встанет на свои места.

Каждый метод из интерфейса (созданного на шаге 2) представляет одну реализацию вызова API вебсервиса. Метод должен иметь HTTP аннотацию(GET, POST, и т.д.) для указания типа запроса и URL адрес. Возвращаемое значение оборачивается в ответе в Call объект, параметризованный типом ожидаемого результата(нашей моделью из 1 шага).

 

Вы можете менять части и параметры URL для настройки запроса. Замена части URL выполняется с помощью фигурных скобок {} . С помощью аннотации @Path мы связываем значение параметра метода со значtнием из скобок {} в аннотации.

Для того что бы выполнить запрос с параметрами их необходимо добавить с аннотацией @Query в сигнатуру метода, в результате чего при вызове они добавятся в конец URL

Аннотация @Body на параметре метода заставит Retrofit использовать объект как тело запроса.

 


2.Retrofit конверторы и адаптеры.

2.1 Конверторы.

Retrofit может быть настроен с использованием специфичных конверторов. Задача конверторов – выполнить (де)сериализацию объектов. Некоторые конверторы для различных преобразований данных:

Для преобразования в JSON и обратно:

  • Gson: com.squareup.retrofit:converter-gson
  • Jackson: com.squareup.retrofit:converter-jackson
  • Moshi: com.squareup.retrofit:converter-moshi

Для работы с протоколами сереализации (Protocol Buffers):

  • Protobuf: com.squareup.retrofit:converter-protobuf
  • Wire: com.squareup.retrofit:converter-wire

Ну и для работы с XML (куда же без него…):

Simple XML: com.squareup.retrofit:converter-simplexml

Ну а если вам захотелось каких то особых извращений или пришлось работать с неким специфичным протоколом – всегда можно создать собственный конвертор, унаследовавшись от класса Converter.Factory

 

2.2 Retrofit адаптеры

Ретрофит можно расширить адаптерами для связи с такими библиотеками как RxJava 2.x, Java 8 и Guava.

С выбором адаптеров можете ознакомиться на Гитхабе square/retrofit/retrofit-adapters/

Для примера RxJava 2.x адаптер может быть добавлен с помощью Gradle:

Или используя Maven

Добавление адаптера в коде выглядит примерно таким методом

Точнее :

С этим адаптером будут добавлены Retrofit интерфейсы, способные возвращать RxJava 2.x типы, например Observable, Flowable или Single и т.д.


  1. Аутентификация в Retrofit

Аутентификация может производиться как используя логин с паролем(Http Basic authentication), так и с применением токенов.

Существует 2 пути для обработки процедуры аутентификации. Первый – использование заголовков с помощью аннотаций. Второй – использование интерцепторов OkHttp. Посмотрим как с этим работать.

3.1 Аутентификация с помощью аннотаций.

Предположим, что вам необходимо получить данные пользователя, для доступа к которым требуется аутентификация. Вы можете сделать это, добавив новые параметры в ваш API интерфейс, например как в коде ниже:

С помощью аннотации @Header(«Authorization») мы просим Retrofit добавить поле Authorization в заголовок запроса со значением, предоставленным в параметре credentials.

Для создания данных пользователя(credentials) мы можем использовать класс Credentials из библиотеки OkHttp, а именно его метод basic(String, String). Как видно из сигнатуры, этот метод получает логин с паролем и возвращает данные для проверки подлинности

Если вы хотите использовать токен, просто вызовите метод getUserDetails(String)

3.2 Аутенфитикация с OkHttp интерцепторами.

Если у вас много вызовов, использующих аутентификацию, то стоит задуматься о использовании интерцепторов. Интерцептор используется для модификации каждого запроса перед его использованием и меняет его заголовок. Преимущество тут заключается в том, что вам не приходится добавлять аннотации  @Header(«Authorization») в каждый вызов методов API.

Что бы добавить интерцептор, вы должны выполнить метод okhttp3.OkHttpClient.Builder.addInterceptor(Interceptor):

Созданный okHttpClient должен быть добавлен как ваш Retrofit клиент в методе retrofit2.Retrofit.Builder.client(OkHttpClient)

Как и в примере с аутенфификацией с помощью аннотаций, вы можете пользоваться токеном везде, где используется класс Credentials


А теперь давайте создадим на android приложение, которое будет выгребать с сайта umori.li анекдоты с помощью Retrofit. Пример будет довольно примитивный и несет в себе лишь цель понять, как необходимо взаимодействовать с основными частями библиотеки.

Итак, помните я в начале упоминал про 3 сущности? Давайте поочередно их создавать. Первая — класс-модель. Воспользуемся сервисом http://www.jsonschema2pojo.org/ для получения класса AnekdotModel. Для этого идём по адресу  http://www.umori.li/api, знакомимся с API, делаем запрос http://www.umori.li/api/get?site=anekdot.ru&name=new+anekdot&num=1 , и вставляем результат ответа уже в наш чудо-сервис. Выбираем JSON, стиль аннотаций Gson, включение сеттеров и геттеров. В результате получаем класс-модель, отражающий данные, которые будут приходить по сети.

С первым разобрались. Перед созданием второй сущности – интерфейса с описанием будущего API, давайте подключим библиотеку Retrofit в наше приложение. Для этого в Gradle необходимо добавить

Есть так же способы подключения библиотеки с помощью Maven или добавления Jar файла, с ними можете ознакомиться на сайте разработчиков библиотеки.

Приступим к созданию интерфейса с API. Он будет состоять из метода получения портянки с анекдотами.

Взглянув на аннотации, мы видим что будет использоваться метод GET, который к базовому URL добавит /api/get?name=”первый параметр”&num=”второй параметр”.

Третья сущность – класс, в котором будем инициализировать Retrofit. Назовем его Controller. Дёргая его за метод getApi мы получаем готовый экземпляр реализации нашего API, который описывали на втором шаге.

Теперь нам осталось собрать все части в единое целое. Получаемыми данными в активности будем наполнять RecyclerView,  часть Gradle с нужыми библиотеками в результате выглядит так

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

Создаем файлы разметки для активити и элемента списка RecyclerView:

activity_main.xml

post_item.xml

Для работы с RecyclerView пишем адаптер. Надеюсь написание всех побочных вещей не вызывает у вас вопросов. Но если вы впервые видите RecyclerView, то можете прочитать о принципах работы с ней тут.

Ну и сам класс MainActivity, где вся магия обретает жизнь:

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

Подведя итог можно выделить следующие фазы написания приложения:

А) Подготовительная. Добавление зависимостей в Gradle, разрешений на работу сетью.

Б) Создание модели данных, так называемого POJO объекта(англ. Plain Old Java Object — «старый добрый Java-объект»). Выполняем запрос к ресурсу, ответ вставляем в один из сервисов(например http://www.jsonschema2pojo.org/) и забираем готовую модель. Можете и вручную описать класс, это уже на ваше усмотрение.

В) Реализация инициализации retrofit’а. Тут вы сами вольны принять архитектурныое решение и разместить инициализацию где вашей душе угодно.  Можете сделать это в отдельном контроллере, как в коде выше, в централизованном месте(например в классе App, кунаследовавшись от Application), или же выполнить реализацию в активити, непосредственно перед использованием библиотеки.

Г) Вызов методов API из реализации модели, которую построит при инициализации Retrofit.Builder и обработка результатов их работы. Размещение данных для показа пользователю, запись в базу данных, построение графика и т.д.

Согласитесь, Retrofit отлично справляется с задачей сокрытия низкоуровневых вызовов, оставляя нам методы API и обработку их обратных вызовов. Надеюсь, что вы сможете избежать массы костылей при работе с сетью, используя эту чудесную библиотеку!

P.s. код на гитхабе


Android - Examples