Тестовые задания для android разработчика

Содержание
  1. 15 неотъемлемых вопросов любого интервью по Android
  2. Вопрос №1.
  3. Существует четыре класса Java, связанные с использованием датчиков на платформе Android. Назовите их и объясните цель каждого.
  4. Вопрос №2.
  5. Что такое ContentProvider и для чего его используют?
  6. Вопрос №3.
  7. При каких условиях код ниже может привести к краху вашего приложения? Как бы вы изменили его, чтобы избежать этой потенциальной проблемы? Поясните свой ответ.
  8. Вопрос №4.
  9. Последний обратный вызов в жизненном цикле активности — onDestroy(). Система вызывает его в качестве последнего сигнала о том, что экземпляр активности полностью удаляется из системной памяти. Обычно система вызывает onPause() и onStop() перед вызовом onDestroy(). Опишите сценарий, когда onPause() и onStop() не будут вызываться.
  10. Вопрос №5.
  11. Какой из приведенных ниже фрагментов кода является правильным способом проверить, присутствует ли в системе датчик компаса? Объясните свой ответ.
  12. Вопрос №6.
  13. Опишите три общих варианта использования Intent.
  14. Вопрос №7.
  15. Предположим, что вы запускаете службу в Activity следующим образом:
  16. Вопрос №8.
  17. Обычно, во время переориентации экрана, платформа Android сбрасывает активность переднего плана, а затем воссоздает ее из значений вида в слое активности. В приложении, над которым вы работаете, вы заметили, что после переориентации экрана значение вида не восстанавливается. Что может быть вероятной причиной проблемы, которую вы должны проверить, как минимум, по этому конкретному виду?
  18. Вопрос №9.
  19. Что такое DDMS? Опишите некоторые из его возможностей.
  20. Вопрос №10.
  21. Какова связь между жизненным циклом AsyncTask и Activity? Какие проблемы могут появиться в связи с этим? Как можно их избежать?
  22. Вопрос №11.
  23. Что такое Intent? Может ли он использоваться для предоставления данных ContentProvider? Объясните свой ответ.
  24. Вопрос №12.
  25. В чем разница между фрагментом и активностью? Объясните взаимосвязь между ними.
  26. Вопрос №13.
  27. В чем разница между Serializable и Parcelable? Что предпочтительнее использовать в Android?
  28. Вопрос №14.
  29. Что такое режимы запуска? Каковы два механизма, с помощью которых они могут быть определены? Какие конкретные типы режимов запуска поддерживаются?
  30. Вопрос №15.
  31. В чем разница между Service и IntentService? Как они используются?
  32. Вопросы и задачи с собеседований на Android разработчика
  33. Вопросы
  34. Архитектура, паттерны
  35. Android
  36. Прочее
  37. Алгоритмические задачки
  38. Code challenge
  39. 1) Приложение, отображающее список сообщений
  40. 2) Приложение с картой и поиском
  41. 3) Приложение, отображающее список квартир.
  42. 4) Выбор машины
  43. 5) Список разных данных

15 неотъемлемых вопросов любого интервью по Android

15 вопросов по Android, которые вы можете встретить на любом собеседовании. Будьте готовы к ним заранее — читайте нашу статью.

Наша статья состоит из 15 вопросов любого собеседования по Android. С их помощью вы сможете произвести нужное впечатление на своего интервьюера.

Вопрос №1.

Существует четыре класса Java, связанные с использованием датчиков на платформе Android. Назовите их и объясните цель каждого.

Четыре класса Java, связанные с использованием датчиков на платформе Android:

  • Sensor: Предоставляет методы для определения возможностей, которые доступны конкретному датчику.
  • SensorManager: Предоставляет методы регистрации активности с датчиков и их калибровки.
  • SensorEvent: Предоставляет необработанные данные датчика, включая информацию о точности.
  • SensorEventListener: Интерфейс, который определяет методы обратного вызова, которые будут получать уведомления о событиях датчика.

Вопрос №2.

Что такое ContentProvider и для чего его используют?

ContentProvider управляет доступом к структурированному набору данных. Он инкапсулирует данные и предоставляет механизмы для определения их безопасности. ContentProvider — это стандартный интерфейс, который соединяет данные в одном процессе с кодом, запущенным в другом процессе.

Вопрос №3.

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

Implicit intent определяет действие, которое может вызывать любое приложение на устройстве, способном его выполнить.
Его полезно использовать в случае если другие приложения могут выполнить действие, которое невозможно для вашего. Если зарегистрировано более одного приложения, которое может обрабатывать подобный запрос, пользователю будет предложено выбрать, какой из них использовать.

Однако, возможно и то, что приложений, способных выполнить ваше намерение не будет. В этом случае приложение даст сбой при вызове startActivity(). Во избежание этого, перед тем, как вызвать startActivity(),вы должны сначала убедиться, что есть хотя бы одно приложение, зарегистрированное в системе, способное обрабатывать намерение. Для этого используйте resolveActivity() для вашего объекта intent:

Вопрос №4.

Последний обратный вызов в жизненном цикле активности — onDestroy(). Система вызывает его в качестве последнего сигнала о том, что экземпляр активности полностью удаляется из системной памяти. Обычно система вызывает onPause() и onStop() перед вызовом onDestroy(). Опишите сценарий, когда onPause() и onStop() не будут вызываться.

onPause()и onStop()не будут вызываться, если finish()вызывается из метода onCreate(). Это может произойти, например, при обнаружении ошибки во время вызова onCreate()и finish(). В таком случае, однако, любая очистка, которую вы ожидали сделать с помощью onPause()и onStop()не будет выполнена.
Хотя onDestroy() — это последний обратный вызов в жизненном цикле активности, стоит упомянуть, что он не всегда может быть вызван и не должен использоваться для уничтожения ресурсов. Лучше иметь ресурсы, созданные в onStart () и onResume (), и уничтожить их в onStop () и onPause соответственно.

Вопрос №5.

Какой из приведенных ниже фрагментов кода является правильным способом проверить, присутствует ли в системе датчик компаса? Объясните свой ответ.

Правильный ответ — ответ №1, вариант, в котором используется PackageManager.
SensorManager и Sensor являются частью фреймворка Android Sensor и используются для прямого доступа и сбора необработанных данных датчиков. Эти классы не предоставляют никакого метода вродеhasSystemFeature(),который используется для оценки возможностей системы.
Android определяет идентификаторы функций в виде ENUM для любой аппаратной или программной функции, которая может быть доступна на устройстве. Например, идентификатор функции для датчика компаса FEATURE_SENSOR_COMPASS.

Если ваше приложение не может работать без конкретной функции, доступной в системе, вы можете запретить пользователям устанавливать ваше приложение с элементом в файле манифеста приложения, чтобы указать не подлежащую обсуждению зависимость.
Однако, если вы просто хотите отключить определенные элементы вашего приложения, когда функция отсутствует, вы можете использовать классPackageManager. PackageManagerиспользуется для извлечения различных видов информации, относящейся к пакетам приложений, которые в настоящее время установлены на устройстве.

Читайте также:  Running fred для андроид

Вопрос №6.

Опишите три общих варианта использования Intent.

Общие варианты использования Intent:

  • Чтобы начать действие : вы можете запустить новый экземпляр Activity, передав Intent методу startActivity().
  • Чтобы запустить службу: вы можете запустить службу для выполнения одноразовой операции (например, скачать файл), передав Intent вstartService().
  • Для трансляций : Вы можете отправить трансляцию другим приложениям, передавав Intent вsendBroadcast(), sendOrderedBroadcast()или sendStickyBroadcast().

Вопрос №7.

Предположим, что вы запускаете службу в Activity следующим образом:

где MyService обращается к удаленному серверу через Интернет-соединение. Если в Activity отображается анимация, указывающая на какой-то прогресс, с какой проблемой вы столкнетесь и как вы могли бы ее решить?

Ответы удаленной службы через Интернет часто могут занять некоторое время либо из-за сетевых задержек, либо из-за нагрузки на удаленном сервере, либо из-за количества времени, которое требуется удаленной службе для обработки и ответа на запрос.

В результате, если такая задержка происходит, анимация в активности (а что еще хуже, весь поток пользовательского интерфейса) может быть заблокирована и может стать «замороженной» для пользователя, пока клиент ждет ответа от службы. Это связано с тем, что служба запускается в основном потоке приложения (или потоке UI) в Activity.

Эта проблема может (и должна) быть предотвращена путем отнесения любых таких удаленных запросов к фоновому потоку или, когда это возможно, с использованием механизма асинхронного ответа.
Важно! Доступ к сети из потока пользовательского интерфейса вызывает исключение во время выполнения в новых версиях Android, что приводит к сбою приложения.

Вопрос №8.

Обычно, во время переориентации экрана, платформа Android сбрасывает активность переднего плана, а затем воссоздает ее из значений вида в слое активности. В приложении, над которым вы работаете, вы заметили, что после переориентации экрана значение вида не восстанавливается. Что может быть вероятной причиной проблемы, которую вы должны проверить, как минимум, по этому конкретному виду?

Вы должны убедиться, что он имеет верный id. Чтобы система Android могла восстановить состояние экрана, каждое из них должно иметь уникальный идентификатор, предоставляемый атрибутом android:id.

Вопрос №9.

Что такое DDMS? Опишите некоторые из его возможностей.

DDMS — это сервер мониторинга отладки Dalvik, который поставляется с Android. Он предоставляет широкий спектр функций отладки, включая:

  • портовые услуги
  • скриншот
  • информация о потоке и куче
  • отслеживание сетевого трафика
  • входящие вызовы и SMS-спуфинг
  • моделирование состояния сети, скорости и задержки
  • спуфинг данных местоположения

Вопрос №10.

Какова связь между жизненным циклом AsyncTask и Activity? Какие проблемы могут появиться в связи с этим? Как можно их избежать?

AsyncTask не привязан к жизненному циклу Activity, который его содержит. Например, если вы запускаете AsyncTask внутри Activity и пользователь поворачивает устройство, активность будет уничтожена (и будет создан новый экземпляр Activity), но AsyncTask останется целым и продолжит работать до завершения.

Затем, когда AsyncTask завершает работу, вместо обновления UI новой Activity, он обновляет прежний экземпляр Activity (то есть тот, в котором он был создан, но который больше не отображается!). Это может привести к исключению (типа java.lang.IllegalArgumentException: View не подключен к оконному менеджеру, если вы используете, например, findViewByIdдля получения представления внутри Activity).

Также существует вероятность того, что это приведет к утечке памяти, так как AsyncTask поддерживает ссылку на Activity, что предотвращает сбор мусора, пока AsyncTask остается в живых.
По этим причинам использование AsyncTasks для длительных фоновых задач, как правило – плохая идея. Для них должен использоваться другой механизм (например, служба).

Вопрос №11.

Что такое Intent? Может ли он использоваться для предоставления данных ContentProvider? Объясните свой ответ.

Объект Intent является общим механизмом для начала новой активности и передачи данных от одного её вида к другому. Однако вы не можете начать ContentProvider используя Intent.

Когда вы хотите получить доступ к данным в ContentProvider, вместо этого вы должны использовать ContentResolverобъект в приложении Context для связи с провайдером в качестве клиента. Объект ContentResolver взаимодействует с объектом провайдера, являющийся экземпляром класса, который реализует ContentProvider. Объект провайдера получает запросы данных от клиентов, выполняет запрошенное действие и возвращает результаты.

Вопрос №12.

В чем разница между фрагментом и активностью? Объясните взаимосвязь между ними.

Активность , как правило, одиночная, целенаправленная операция, которую может выполнять пользователь (например, набрать номер, сделать снимок, отправить email, просматривать карту, и т.д.). Но в то же время нет ничего, что помешало бы разработчику произвольно создать сложную активность.

Реализации активности могут дополнительно использовать класс Fragment для создания более модульного кода, более сложных пользовательских интерфейсов для больших экранов, помощи в масштабировании приложения между малыми и большими экранами и т. д. Несколько фрагментов могут быть объединены в пределах одной активности, и, наоборот, один и тот же фрагмент часто можно использовать повторно для нескольких активностей. Эта структура в основном предназначена для содействия повторному использованию кода и облегчению масштабирования.

Фрагмент представляет собой модульный раздел активности с собственным жизненным циклом и входными событиями, который может быть добавлен или удален по желанию. Однако важно помнить, что жизненный цикл фрагмента напрямую зависит от жизненного цикла его хост-активности; т. е. когда активность приостановлена, все фрагменты в ней также будут приостановлены, и когда активность разрушена, все ее фрагменты будут разрушены.

Вопрос №13.

В чем разница между Serializable и Parcelable? Что предпочтительнее использовать в Android?

Serializable — это стандартный Java-интерфейс. Вы просто отмечаете класс Serializable, реализуя интерфейс, и Java будет автоматически сериализовать его в определенных ситуациях.
Parcelable — это специфический для Android интерфейс, где вы сами реализуете сериализацию. Он был создан более эффективным, чем Serializable, а также для обхода некоторых проблем со схемой сериализации Java по умолчанию.

Вопрос №14.

Что такое режимы запуска? Каковы два механизма, с помощью которых они могут быть определены? Какие конкретные типы режимов запуска поддерживаются?

«Режим запуска» — это способ, которым новый экземпляр активности должен быть связан с текущей задачей.
Режимы запуска могут быть определены с использованием одного из двух механизмов:

  • Файл манифеста. При объявлении активности в файле манифеста вы можете указать, как она должна ассоциироваться с задачами при ее запуске. Поддерживаемые значения:
    • standard(по умолчанию). Несколько экземпляров класса активности могут быть созданы и несколько экземпляров могут быть добавлены к одной и той же задаче или различным задачам. Это общий режим для большинства видов деятельности.
    • singleTop отличается от standard тем, что если экземпляр активности уже существует в верхней части текущей задачи, и система перенаправляет намерение на это действие, новый экземпляр не будет создан, поскольку он будет запускать метод onNewIntent()вместо создания нового объекта.
    • singleTask Всегда создается новая задача, а новый экземпляр будет перенесен в задание в качестве корневого. Однако, если какой-либо экземпляр активности существует в какой-либо из задач, система направляет намерение этому экземпляру активности через вызов метода onNewIntent(). В этом режиме экземпляры активности могут быть перенесены в одну и ту же задачу. Этот режим полезен для активностей, которые играют роль точек входа.
    • singleInstance подобна singleTask, с той лишь разницей, что экземпляр no activities не может быть перенесен в ту же задачу singleInstance. Соответственно, активность в режиме запуска всегда находится в одной задаче экземпляра активности. Это специализированный режим и должен использоваться только в приложениях, которые реализуются как одно действие.
  • Intent-флаги. Вызовы startActivity () могут содержать флаг в намерении, который объявляет, как новое действие должно быть связано с текущей задачей. Поддерживаемые значения:
    • FLAG_ACTIVITY_NEW_TASK, То же, что и значение singleTaskв файле манифеста (см. выше).
    • FLAG_ACTIVITY_SINGLE_TOP, То же, что и значение singleTopв файле манифеста (см. выше).
    • FLAG_ACTIVITY_CLEAR_TOP, Если запущенная активность уже запущена в текущей задаче, то вместо запуска ее нового экземпляра будут уничтожены все остальные активности поверх нее, и это намерение будет передано возобновленному экземпляру активности (теперь вверх), через onNewIntent(). В файле манифеста нет соответствующего значения, которое создает такое поведение.
Читайте также:  Андроид ярлык файл pdf

Вопрос №15.

В чем разница между Service и IntentService? Как они используются?

Service является базовым классом для служб Android, который может быть расширен для создания любой из них. Класс, который напрямую расширяет Service запускается в основном потоке. По этой причине он блокирует UI (если он есть) и должен использоваться только для кратковременных задач. Для более длительных задач лучше использовать другие потоки.

IntentService является подклассом Service, который обрабатывает асинхронные запросы (выраженные как «Intent») по требованию. Клиенты отправляют запросы через вызовы startService(Intent). Служба запускается по мере необходимости, по очереди обрабатывает каждую Intent с помощью рабочего потока и останавливается, когда заканчивается работа. Написание IntentServiceможет быть довольно простым; просто расширьте класс IntentService и переопределите метод onHandleIntent(Intent intent), в котором вы можете управлять всеми входящими запросами.

Источник

Вопросы и задачи с собеседований на Android разработчика

В прошлом посте я подробно описал процесс поиска работы в Берлине. В течение этого процесса я сталкивался с вопросами, алгоритмическими задачками и Code challenge. В этом посте я распишу свой опыт в этом деле.

Вопросы

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

Архитектура, паттерны

  • Какие паттерны знаете?
  • Считаете ли вы Singleton антипаттерном?
  • Опишите принципы MVP. Какие еще есть похожие MV*, в чем разница между ними?
  • Объясните принцип DI
  • Объясните принципы SOLID
  • Объясните принципы Clean Architecture

Android

  • Как можно выявить проблемы в скорости UI и устранить их?
  • Какие проблемы были с использованием Dagger?
  • Приходилось ли использовать Guard?
  • Что такое multidex?
  • Приходилось ли сталкиваться с миграцией с Dalvik на новую технологию ART?
  • Начиная с какой версии пишете под Android? Какие были сложности с разницей версий?
  • Асинхронные механизмы загрузки в Android
  • В чем отличие AsyncTask от Thread?
  • Минусы AsyncTask
  • Опишите, что такое Activity
  • Чем Fagment отличается от Activity?
  • Разница между Service и IntentService. Пример использования Service.
  • Зачем нужен Headless fragment (без View и с setReatinInstance = true)? Приходилось ли использовать?
  • Какие новшества были в последней версии Android?
  • Как определяете, какой layout надо использовать для смартфона, а какой для планшета?
  • Как в коде определите: планшет это или смартфон?
  • Пример использования BroadcastReceiver
  • Опишите LifeCycle Activity
  • Отличия Serializable и Parcelable
  • Контракт hashcode и equals
  • Виды коллекций в Java: List, Set, Queue, Stack
  • Разница между ArrayList и LinkedList. В каком случае что лучше использовать?
  • Принцип работы HashMap и HashSet
  • Что такое Generic?
  • Когда используем bounded type: «T extends Class» и «T super Class»? Каковы их ограничения.
  • Отличия Abstract от Interface, когда какой лучше использовать?
  • Разница между pull и fetch
  • Разница между merge and rebase

Прочее

  • Минусы использования сторонних библиотек
  • Что вы будете делать, если ваше решение не совпадает с решением коллег или лида?
  • Какие свои качества работы в команде вы можете описать?
  • Если бы вы могли вернуться на 3-4 года назад, что бы вы изучали?
  • У вас есть команда, какие правила вы установите, чтобы писать тесты?
  • Какую книгу вы можете посоветовать? Необязательно про программирование.
  • Ваша жена не против релокации?

Алгоритмические задачки

В процессе интервью вам могут дать небольшие алгоритмические задачки, чтобы посмотреть на ваш уровень знания алгоритмов. Может быть и так, что все интервью состоит из одной или нескольких таких задач.

  • Реализация merge сортировки из двух списков
  • Реверс массива
  • Из «abaaeba» получить (a: 4, b:2, e:1)
  • Реализация Set с помощью List (методы int count, boolean add, boolean remove)
  • Калькулятор, который парсит строки типа «1+2», «1 + 2 * 3 + 4» и возвращает вычисленное значение. Из операторов могут встречаться только + и *.
  • Написать Reentrant блокировку
  • Посмотреть код, где несколько потоков меняют одну Integer переменную. Сказать, какое значение получится в итоге. Предложить варианты исправления.

Code challenge

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

Я убрал реальные адреса серверов из ссылок, чтобы не палить конторы.

1) Приложение, отображающее список сообщений

На сервере есть json файлы. До них можно добраться по ссылке: https:// /endpoint/.json, где PAGE — номер файла от 0 до какого-то произвольного числа, например, 15.

Читайте также:  Календарь для андроид с синхронизацией контактов

Каждый файл — это json массив из 50 сообщений. Сообщение содержит поля id, time и text.

Приложение должно загрузить сообщения с сервера и показать их в списке.

Юзер может удалить сообщение. Предпочтительно — свайпом, но можно и долгим нажатием.

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

  • постраничная подгрузка при скролле
  • кэширование, чтобы приложение при старте показывало ранее загруженные сообщения
  • некоторые сообщения в поле text вместо текста содержат ссылку на картинку, хорошо бы подгрузить и показать эту картинку

Срок выполнения — 5 дней. Про тесты ничего не сказано.

Я от себя добавил:

  • action mode, чтобы удалять сообщения
  • Retry кнопку, если была ошибка при загрузке данных
  • отдельный экран для просмотра сообщения из списка. Переход на экран был с анимацией Activity Transition. Картинка показывалась сначала из кэша в плохом качестве (как в списке), а затем грузилась полная версия.

2) Приложение с картой и поиском

Приложение должно найти и показать на карте 5 объектов, ближайших к вашей текущей локации.

Пример запроса: https:// /places/search?at=52.5311%2C13.3847&q=restaurant

В at передаем координаты своего местоположения, а в q — поисковый запрос. Результат приходит в json формате.

Результаты надо показать на карте. Можно использовать Google Maps. Но у этой компании было свое SDK для отображения карты, и я изучил и использовал его. Тем самым показал, что быстро могу разобраться в новом для себя SDK. При этом я заметил несколько вещей, которые можно было улучшить/исправить в SDK и на последующем собеседовании рассказал об этом.

Приоритет — качество. Про тесты ничего не сказано. Срок выполнения — неделя.

3) Приложение, отображающее список квартир.

По запросу на сервер приходит такой ответ:

items — список квартир. Для каждой квартиры указаны название, цена, локация, фото.

Необходимо в списке отобразить все полученные items. Каждая квартира должна показать первое из доступных фото, заголовок, цену и адрес. Примерный макет layout прилагался, но можно и что-то свое придумать.

Каждая квартира в списке может быть добавлена в избранное. Т.е. надо в layout квартиры добавить какую-то метку (например, звездочку), которая будет кликабельна и отобразит статус: в избранном или нет. Информация о том, что квартира добавлена в избранное, должна храниться локально. Т.е. после перезапуска приложения вы должны видеть, какие квартиры были отмечены

В приложении должен быть экран с картой, которая отображает локации всех квартир из списка.

Про тесты ничего не сказано. Срок выполнения — 5 дней.

Я все сделал и добавил несколько фич:

  • поддержка альбомной ориентации. В этом случае слева отображался список, а справа — карта.
  • нажатие на иконку в action bar покажет/скроет карту
  • нажатие на квартиру в списке центрирует ее на карту
  • и наоборот, нажатие на маркер квартиры на карте проскроллит список до этой квартиры

4) Выбор машины

Необходимо сделать что-то типа визарда для выбора автомобиля. На первом экране выбирается производитель (марка), на втором — модель, на третьем — год.

Соответственно, на сервере есть три метода, которые вам необходимо вызывать для получения этих данных.

— первый возвращает список производителей (id, name).

— второй принимает выбранный id из первого и возвращает список моделей этого производителя (name)

— третий метод принимает id из первого методы и name из второго и возвращает годы выпуска.

Первые два метода поддерживают постраничную подгрузку — у них есть параметры page и pageSize, и они возвращают totalPageCount.

Каждый экран должен отображать результаты выбора предыдущих экранов. Четвертый экран должен показать все, что в итоге было выбрано на предыдущих трех.

  • минимальный API — 16
  • постраничная загрузка на первом и втором экранах. Размер страницы — 15
  • идеально, если переход между экранами будет с анимацией
  • сделайте разные layout для четных и нечетных строк списка
  • поворот экрана должен работать без проблем

Опционально: на втором экране вместо постраничной загрузки грузите все сразу и добавьте текстовый фильтр по названию модели.

Вся работа по идее должна занять 5-6 часов, но они там понимают, что у вас есть дела/работа и вам дают неделю. Тесты писать необязательно, но если напишете, это будет большим плюсом.

5) Список разных данных

Надо собрать данные с двух разных API и отобразить их в одном списке.

1) Получить 50 репозиториев указанного юзера на github, используя GraphQL (https://developer.github.com/v4/)
2) Получить 50 фото с поиска Flickr. Там обычный json или xml (https://www.flickr.com/services/api/flickr.photos.search.html)

Вывести эти результаты в одном списке, чередуя друг с другом (репозиторий, картинка, репозиторий, картинка, . ).

Изначально экран не должен отображать данные. Есть только кнопка Load, по нажатию на которую начинается загрузка. Последующие нажатия на кнопку должны перезапускать загрузку.

Github данные должны отображаться просто как имя репозитория. Flickr данные должны отображаться как картинка. Нажатие на любой пункт списка должен перезапускать загрузку данных.

Можно писать на Kotlin. Про тесты ничего не сказано. Срок выполнения — 2 рабочих дня.

В этом задании для меня новым было GraphQL. Пришлось повозиться, пока нормально данные с гитхаба пошли. Времени на всякие плюшки в итоге не хватило.

Для всех этих заданий я делал тесты. В качестве архитектуры использовал MVP, а в двух последних еще и Clean Architecture. По возможности старался сделать чуть больше, чем надо, и добавлял какие-то навороты и удобства. Но уложиться в срок и сделать все качественно и красиво — всегда было приоритетом.

Присоединяйтесь к нам в Telegram:

— в канале StartAndroid публикуются ссылки на новые статьи с сайта startandroid.ru и интересные материалы с хабра, medium.com и т.п.

— в чатах решаем возникающие вопросы и проблемы по различным темам: Android, Kotlin, RxJava, Dagger, Тестирование

— ну и если просто хочется поговорить с коллегами по разработке, то есть чат Флудильня

— новый чат Performance для обсуждения проблем производительности и для ваших пожеланий по содержанию курса по этой теме

Источник

Оцените статью