Как мы уменьшили количество ошибок в Unreal Engine с помощью статического ана...Platonov Sergey
Размер и сложность проектов растёт. С кодом всё сложнее совладать, поэтому статический анализ всё больше набирает популярность. А лидеры отрасли все чаще внедряют такие инструменты у себя. Мы расскажем об использования статического анализатора кода в игровой индустрии на примере работы с проектом Unreal Engine 4. Про это на сайте компании Epic Games можно найти статью. Но одно дела статья, а другое дело живой рассказ. Вы услышите интересные истории, увидите примеры ошибок в коде Epic Games, да и просто пообщаетесь с участниками внедрения анализатора. Если вы ещё не решили, нужен ли статический анализатор вашему проекту, обязательно приходите послушать наш доклад.
В лекции подробно рассмотрены тонкие моменты языка JavaScript, с которыми часто возникают основные проблемы. Наглядные примеры и рецепты помогают лучше понять его особенности.
Как мы уменьшили количество ошибок в Unreal Engine с помощью статического ана...Platonov Sergey
Размер и сложность проектов растёт. С кодом всё сложнее совладать, поэтому статический анализ всё больше набирает популярность. А лидеры отрасли все чаще внедряют такие инструменты у себя. Мы расскажем об использования статического анализатора кода в игровой индустрии на примере работы с проектом Unreal Engine 4. Про это на сайте компании Epic Games можно найти статью. Но одно дела статья, а другое дело живой рассказ. Вы услышите интересные истории, увидите примеры ошибок в коде Epic Games, да и просто пообщаетесь с участниками внедрения анализатора. Если вы ещё не решили, нужен ли статический анализатор вашему проекту, обязательно приходите послушать наш доклад.
В лекции подробно рассмотрены тонкие моменты языка JavaScript, с которыми часто возникают основные проблемы. Наглядные примеры и рецепты помогают лучше понять его особенности.
Мало кто отчетливо представляет, как работают исключения в С++.
Автор пытается восполнить этот пробел, заодно пытаясь выяснить, почему всё устроено так как оно устроено и нельзя ли там чего-нибудь улучшить.
1) Две основные проблемы - как обустроить раскрутку стека
и как осуществить передачу управления при возникновении исключения
2) Раскрутка стека - GCC LDSA, MSVC32, MSVC64
3) Передача управления - SJLJ, DW2, MSVC
4) Раскручиваем стек своими руками
This presentation is about PHP7, its innovations’ overview with practical examples. You will learn how to move to PHP7 and see performance сomparison between PHP 5.6 and PHP7.
This presentation by Dmytro Nazarenko (Senior PHP Developer / Tech Lead) was delivered at GlobalLogic Kharkiv PHP Meetup #1 on September 14, 2016.
Михаил Рахманов рассказывает о паттерне Promise и его использовании в iOS разработке.
Краткие тезисы:
- Что такое promises?
- Использование promises в iOS разработке (существующие библиотеки и подходы)
- Реализация promises библиотекой PromiseKit (основные методы, цепочки promises, обработка ошибок)
- Какие задачи можно решить с помощью promises, а какие - нельзя
- Использование promises на примере приложения: драм-машины с возможностью сохранять аудио-дорожки
- Подведение итогов: преимущества и недостатки.
RDSDataSource - внутренние пятничные митапы iOS-команды RAMBLER&Co.
Asterisk: настраиваем цифровую АТС за одно занятиеSkillFactory
Инструктор онлайн-школы SkillFactory Александр Левичев о самом популярном open-source решении для IP-телефонии – Asterisk, а также о том, как правильно установить и провести базовую конфигурацию, даже если вы в первый раз сталкиваетесь с этим решением.
Пользователь точно оценит! Повышение производительности мобильных приложений ...Ontico
Расскажем о методиках создания производительных приложений, опираясь на собственный многолетний опыт проб и ошибок:
• использование инструментов отладки (работа с Hierarchy Viewer; поиск и устранение overdraw; профилирование методов; поиск утечек памяти);
• написание производительного кода;
• создание верстки, повышающей скорость работы приложений;
• создание требований к дизайну интерфейсов и API с оглядкой на производительность;
• использование аналитики для логирования и отладки багов.
Android-приложения Superjob:
• 3 приложения в Google Play для B2C и B2B-аудиторий;
• более 1 млн. пользователей;
• в числе лучших российских приложений по мнению Google Play.
Нельзя просто так взять и сделать версионирование APIEatDog
"Нельзя просто так взять и сделать версионирование API"
Почему важно иметь версионирование и какие проблемы оно решает
Какие есть подходы к версионированию API
Какие инструменты и решения предоставляют популярные веб-фреймворки
Почему версионирование - это не просто и как решить возникшие трудности
Выводы
Generics were added to the Java language more than 10 year ago. But do you really understand them?
We’ll discuss:
What is heap pollution?
How does the compiler translate generics?
Why it’s not allowed to create parametrized array (List<string>[])
What are bridge methods, can we reach them?
Type erasure rules
Difference between List, List<object>, List<?>
Why it’s not allowed to add Integer to List<?>
Why it’s not allowed to parameterize exception classes?
What’s wrong with Collections.max signature: <t><?>> T max(Collection<?> coll);
Code that should be compiled, but can’t be compiled and vice versa
How to write good API using generics and wildcards
And other generic puzzlers
* Почему Angular 2 такой быстрый и как его ускорить еще сильнее?
* Как работает Change Detection механизм и как им управлять?
* Зачем нам Zone.js и Функциональное Реактивное Программирование?
* Как работать с Redux и Mobx в Angular 2 и что можно от этого выиграть?
Об этом и ряде других вещей вы узнаете из этого доклада.
Превышаем скоростные лимиты с Angular 2 / Алексей Охрименко (IPONWEB)Ontico
* Почему Angular 2 такой быстрый и как его ускорить еще сильнее?
* Как работает Change Detection механизм и как им управлять?
* Зачем нам Zone.js и Функциональное Реактивное Программирование?
* Как работать с Redux и Mobx в Angular 2 и что можно от этого выиграть?
Об этом и ряде других вещей вы узнаете из этого доклада.
Ловля сетями. Инструменты отладки сетевых запросов приложений / Дмитрий Рыбак...Ontico
РИТ++ 2017, AppsConf
Зал Найроби + Касабланка, 5 июня, 11:00
Тезисы:
http://appsconf.ru/2017/abstracts/2584.html
Большинство современных мобильных приложений так или иначе работает с каким-то API (а зачастую и не с одним). Количество запросов при этом может достигать десятков в минуту и понимание того, что сейчас происходит в сетевом слое вашего приложения, становится непростой задачей.
Я расскажу и покажу весь диапазон современных средств для мониторинга и отладки сетевых запросов: от самых простых до узкоспециальных - с плюсами/минусами каждого из инструментов и областями их применения.
AIDL в современном мире, Виктор Лапин. 8 июня, 2019Mail.ru Group
В докладе:
Как "олдскульный" AIDL вполне неплохо может быть использован в мире современных паттернов.
На примере существующего и опубликованного в Play Store приложения будет показано, как команда проекта реализовала аудио плеер с применением IPC.
Павел Сушин «Асинхронное программирование на С++: callbacks, futures, fibers»Platonov Sergey
За время работы над проектом был разработан удобный фреймворк для написания асинхронного кода. В докладе будет рассмотрено то, как он устроен и как со временем эволюционировал. Разберемся, как с помощью наших примитивов решать проблемы, часто встречающиеся в асинхронном программирование; будут примеры удачного и неудачного использования. Отдельно остановимся на сравнении получившихся средств с тем, что было добавлено в С++11.
Мало кто отчетливо представляет, как работают исключения в С++.
Автор пытается восполнить этот пробел, заодно пытаясь выяснить, почему всё устроено так как оно устроено и нельзя ли там чего-нибудь улучшить.
1) Две основные проблемы - как обустроить раскрутку стека
и как осуществить передачу управления при возникновении исключения
2) Раскрутка стека - GCC LDSA, MSVC32, MSVC64
3) Передача управления - SJLJ, DW2, MSVC
4) Раскручиваем стек своими руками
This presentation is about PHP7, its innovations’ overview with practical examples. You will learn how to move to PHP7 and see performance сomparison between PHP 5.6 and PHP7.
This presentation by Dmytro Nazarenko (Senior PHP Developer / Tech Lead) was delivered at GlobalLogic Kharkiv PHP Meetup #1 on September 14, 2016.
Михаил Рахманов рассказывает о паттерне Promise и его использовании в iOS разработке.
Краткие тезисы:
- Что такое promises?
- Использование promises в iOS разработке (существующие библиотеки и подходы)
- Реализация promises библиотекой PromiseKit (основные методы, цепочки promises, обработка ошибок)
- Какие задачи можно решить с помощью promises, а какие - нельзя
- Использование promises на примере приложения: драм-машины с возможностью сохранять аудио-дорожки
- Подведение итогов: преимущества и недостатки.
RDSDataSource - внутренние пятничные митапы iOS-команды RAMBLER&Co.
Asterisk: настраиваем цифровую АТС за одно занятиеSkillFactory
Инструктор онлайн-школы SkillFactory Александр Левичев о самом популярном open-source решении для IP-телефонии – Asterisk, а также о том, как правильно установить и провести базовую конфигурацию, даже если вы в первый раз сталкиваетесь с этим решением.
Пользователь точно оценит! Повышение производительности мобильных приложений ...Ontico
Расскажем о методиках создания производительных приложений, опираясь на собственный многолетний опыт проб и ошибок:
• использование инструментов отладки (работа с Hierarchy Viewer; поиск и устранение overdraw; профилирование методов; поиск утечек памяти);
• написание производительного кода;
• создание верстки, повышающей скорость работы приложений;
• создание требований к дизайну интерфейсов и API с оглядкой на производительность;
• использование аналитики для логирования и отладки багов.
Android-приложения Superjob:
• 3 приложения в Google Play для B2C и B2B-аудиторий;
• более 1 млн. пользователей;
• в числе лучших российских приложений по мнению Google Play.
Нельзя просто так взять и сделать версионирование APIEatDog
"Нельзя просто так взять и сделать версионирование API"
Почему важно иметь версионирование и какие проблемы оно решает
Какие есть подходы к версионированию API
Какие инструменты и решения предоставляют популярные веб-фреймворки
Почему версионирование - это не просто и как решить возникшие трудности
Выводы
Generics were added to the Java language more than 10 year ago. But do you really understand them?
We’ll discuss:
What is heap pollution?
How does the compiler translate generics?
Why it’s not allowed to create parametrized array (List<string>[])
What are bridge methods, can we reach them?
Type erasure rules
Difference between List, List<object>, List<?>
Why it’s not allowed to add Integer to List<?>
Why it’s not allowed to parameterize exception classes?
What’s wrong with Collections.max signature: <t><?>> T max(Collection<?> coll);
Code that should be compiled, but can’t be compiled and vice versa
How to write good API using generics and wildcards
And other generic puzzlers
* Почему Angular 2 такой быстрый и как его ускорить еще сильнее?
* Как работает Change Detection механизм и как им управлять?
* Зачем нам Zone.js и Функциональное Реактивное Программирование?
* Как работать с Redux и Mobx в Angular 2 и что можно от этого выиграть?
Об этом и ряде других вещей вы узнаете из этого доклада.
Превышаем скоростные лимиты с Angular 2 / Алексей Охрименко (IPONWEB)Ontico
* Почему Angular 2 такой быстрый и как его ускорить еще сильнее?
* Как работает Change Detection механизм и как им управлять?
* Зачем нам Zone.js и Функциональное Реактивное Программирование?
* Как работать с Redux и Mobx в Angular 2 и что можно от этого выиграть?
Об этом и ряде других вещей вы узнаете из этого доклада.
Ловля сетями. Инструменты отладки сетевых запросов приложений / Дмитрий Рыбак...Ontico
РИТ++ 2017, AppsConf
Зал Найроби + Касабланка, 5 июня, 11:00
Тезисы:
http://appsconf.ru/2017/abstracts/2584.html
Большинство современных мобильных приложений так или иначе работает с каким-то API (а зачастую и не с одним). Количество запросов при этом может достигать десятков в минуту и понимание того, что сейчас происходит в сетевом слое вашего приложения, становится непростой задачей.
Я расскажу и покажу весь диапазон современных средств для мониторинга и отладки сетевых запросов: от самых простых до узкоспециальных - с плюсами/минусами каждого из инструментов и областями их применения.
AIDL в современном мире, Виктор Лапин. 8 июня, 2019Mail.ru Group
В докладе:
Как "олдскульный" AIDL вполне неплохо может быть использован в мире современных паттернов.
На примере существующего и опубликованного в Play Store приложения будет показано, как команда проекта реализовала аудио плеер с применением IPC.
Павел Сушин «Асинхронное программирование на С++: callbacks, futures, fibers»Platonov Sergey
За время работы над проектом был разработан удобный фреймворк для написания асинхронного кода. В докладе будет рассмотрено то, как он устроен и как со временем эволюционировал. Разберемся, как с помощью наших примитивов решать проблемы, часто встречающиеся в асинхронном программирование; будут примеры удачного и неудачного использования. Отдельно остановимся на сравнении получившихся средств с тем, что было добавлено в С++11.
Мир мобильных телефонов очень сильно изменил нашу жизнь. В наше время невозможно представить современного человека, без этого чудо устройства. На рынке появляется все больше устройств и приложений. И чтобы удобнее пользоваться этими приложениями пользователи выбирают “умные” телефоны, или как их еще принято называть смартфоны. В своем докладе я хочу поделиться своим опытом автоматизации приложений под Android и iOS. Я расскажу о том, какие инструменты автоматизации я использовал. Поговорим о недостатках этих инструментов и какие из них стоит использовать у себя на проекте.
Опыт разработки сложных клиент-серверных приложений на TypeScript и ASP.NETGoSharp
Наша команда в DevExpress недавно выпустила Preview версию нового продукта, RTF web-редактора – ASPxRichEdit.
Продукт требует высокой отзывчивости на действия пользователя и максимальной производительности. Поэтому клиент получился «толстым» в отличие от «тонких клиентов» большинства бизнес-приложений.
В составе продукта два полнофункциональных компонента - клиентский и серверный текстовые процессоры. Оба компонента работают независимо друг от друга. Клиентская часть создавалась как оптимизированная версия серверного компонента, переписанного с .NET на TypeScript.
Клиентская часть не уступает в сложности серверной. Кроме того, возникают дополнительные проблемы синхронизации состояний моделей на клиенте и сервере и глубокого тестирования клиент-серверного взаимодействия.
В этом докладе вы узнаете, как мы разрабатывали этот продукт, какие проблемы встретили и какие методики тестирования использовали.
Что нам стоит DAL построить? Акуляков Артём D2D Just.NETDev2Dev
Работа с данными - это ключевая функция большинства приложений. Но работать с данными не так просто как кажется. С одной стороны, нам нужна производительность, с другой все best practices диктуют нам принцип persistence ignorance, с третьей еще и хочется писать красивый и понятный код. Как найти баланс между всем этим? Чем хороший IRepository отличается от плохого? Что такое CQRS и причем тут функциональное программирование? Об этом и пойдет речь, а так же немного граблей и личного опыта.
Держите одеяло у себя: как общаться с кандидатом и узнавать все, что вам инте...Mad Devs
Маргарита Мысина, рекрутер в Mad Devs поделилась темой «Держите одеяло у себя: как общаться с кандидатом и узнавать все, что вам интересно».
Маргарита начала свою карьеру HR в IT в технологическом стартапе, а пару лет назад присоединилась к команде HR в Mad Devs, в качестве сорсера, а затем рекрутера. За время своей работы в найме Маргарита приобрела огромный опыт, который передаст в своем докладе, рассказывая о том, как общаться с кандидатами и ненавязчиво узнавать всю нужную рекрутеру информацию.
Дружелюбнй онбординг: как с увеличением количества не потерять качество Mad Devs
Клара Абдукова, HR-специалист в Mad Devs презентовала о «Дружелюбном онбординге: как с увеличением количества не потерять качество»
Клара уже несколько лет работает в ИТ и в настоящее время занимает позицию лида онбординга в Mad Devs. Она заонбордила более 100 человек, ее опыт позволил сделать процесс онбординга в компанию не только четким, но и прозрачным. В своем докладе Клара расскажет весь путь выстраивания процесса онбординга и поделилась инсайтами, которые помогут HR-специалистам в создании и проведении этого важного процесса.
Mad Stream продолжается!
Нам повезло пригласить нашего Senior Backend Разработчика, Solution Architect, Нурадила Алымкулова, поделиться знаниями с нами.
Нурадил работал в разработке разнообразных систем банка, телекоммуникационных компаниях - одним словом, в энтерпрайзах. Теперь Нурадил хочет поделиться своими огромным опытом и наблюдением в разработки сложных систем.
На этом стриме Нурадил выступит с темой “Проектирование архитектуры приложения 101” мы начнем с:
описания бизнес-требований с помощью последовательных диаграмм;
разберем классовые диаграммы;
опишем поведение программы с помощью флоу-диаграм.
На данном стриме мы пройдем путь создания приложения от начала до конца! После стрима у нас обязательно будет сессия вопросов и ответов.
Mad Stream начнется в 19.30, в этот четверг 12-го ноября!
Ссылка на трансляцию:
https://youtu.be/tKymOf3O9gc
У нас часто спрашивают, как начать программировать самостоятельно и не “перегореть” во время обучения. Теперь можно спросить об этом напрямую у нашего сотрудника Айбека Ногоева!
До Mad Devs Айбек работал в международной аудиторской компании. Там всего за год он поднялся с Junior позиции до уровня Senior и был тимлидом во многих проектах. Чтобы расширить список своих навыков и круг возможностей, Айбек решил начать программировать. После двух месяцев самостоятельного обучения он попал в Mad Devs, и теперь он наш Android-разработчик.
Программируя под Android, Айбек изучил еще и iOS разработку, без каких-либо курсов и чьей-либо помощи. На Mad Stream Айбек выступит с темой: “Соло-прокачка мобильного разработчика”.
На стриме Айбек затронет несколько тем, важных для любого начинающего “мобильщика”:
Как изучать программирование самостоятельно?
Как быстро освоить мобильную разработку?
Как не “перегореть” в процессе обучения?
Как развивать базовые навыки дальше?
Если собираетесь “войти в айти”, опыт Айбека будет вам очень кстати. Интересно узнать работающие лайфхаки?
Тогда скорее сохраняйте ссылку на стрим!
This document discusses habits of highly effective developers, including: holding daily standup meetings to update teammates on work completed, in progress, and blockers; basing work on documented issues to provide context and accountability; thoroughly documenting code, services, and projects; visualizing project data and events; doing demos to showcase work; following good coding practices like testing and automation; communicating carefully and thanking teammates.
Mad Stream: "Что можно напечатать на 3d принтере, помимо еще одного 3d принте...Mad Devs
Наш специалист по Embedded System Engineering, Антон Козлов, выступит с темой:
«Что можно напечатать на 3d принтере, помимо ещё одного 3d принтера.»
⠀
На стриме вы узнаёте:
1. О том как нам преподносят трехмерную печать и чем она является на самом деле;
2. Трехмерная печать не серебряная пуля, недостатки технологии как: масштабируемость, цена, качество изделий;
3. Основные виды трехмерных принтеров доступных простому обывателю и принцип их работы;
4. Пример проекта в котором трехмерная печать ускорит разработку продукта.
Ссылка на стрим: https://www.youtube.com/watch?v=klHxO9c1d2Y&feature=youtu.be
Maв Stream: "Факт карты на службек у ПМа", спикер – Дмитрий КононенкоMad Devs
Вы когда-нибудь слышали о факт-картах? Если коротко – это особый инструмент, помогающий мышлению решать сложные интеллектуальные задачи. Это методика выстраивания целей и нахождения эффективных решений применимых к любой сфере. В ходе презентации Дима "разжует" основные понятия относящиеся к факт-картам и как обычно даст много полезных советов, что называется "из жизни".
Лайфхаки менеджмента на удаленке от Дмитрия КононенкоMad Devs
В ходе презентации, все заинтересованные узнают о том, как организовать коммуникации и процессы команды разработки в условиях всеобщей изоляции. Дима подкинет классных тулзов для упрощения и улучшения процессов, а также поделится собственным опытом и даст много полезных советов.
Этот Mad Talks о неудачном опыте в живом продакшн проекте. Александр расскажет историю о том, как настроили отказоустойчивость системы бизнес-проекта и жили спокойно, пока не решили чинить поломанную репликацию и в итоге получили split-brain.
Основные преимущества и недостатки нативных и кроссплатформенных приложений: что из себя представляет каждый тип приложений и для каких целей он служит.
Более подробно рассматривается Flutter - набор инструментов, позволяющий разработчикам писать кроссплатформенные приложения. Почему стоит обратить на него внимание и начать инвестировать в изучение Flutter.
Ethereum is a blockchain network that allows developers to build decentralized applications and smart contracts. It uses proof-of-work consensus to validate transactions and add them to immutable blocks. Smart contracts deployed on Ethereum are public and their source code can be viewed by anyone. Ethereum is working to transition from proof-of-work to proof-of-stake consensus.
Ethereum: аспекты разработки смарт-контрактовMad Devs
- Что такое умные контракты (смарт-контракты)?
- Представление смарт-контрактов в Ethereum.
- Смарт-контракты на примере - ERC20 токен.
- Понятие топлива (газа) в Ethereum.
- Инструментарий разработки смарт-контрактов.
- Способы интеграции смарт-контрактов Ethereum с внешним ПО.
2. Что такое Retrofit
Retrofit (согласно официальному сайту) — типобезопасный
HTTP-клиент для Android и Java. Он является
незаменимым инструментом для работы с API в клиент-
серверных приложениях. Каких-то лет 5 назад Android-
разработчикам для работы с сетью приходилось воротить
горы кода с обратными вызовами, AsyncTask'ами и
прочими «низкоуровневыми» вещами. И компания Square
выпустила такую замечательную библиотеку — Retrofit.
4. База с endpoint
- Создаем класс типа Interface и описываем все наши
эндпоинты
public interface Endpoint { }
Пример на Kotlin
5. Формат ендпоинтов
Если нужно добавить динамически формировать урл то
используем Path
@GET("group/{id}/users")
Call<List<User>> groupList(@Path("id") int groupId);
Если нужно вставлять параметры в Get запрос типа
?sort=desc то
@Query("sort") String sort
Если список параметров query динамичен то используем
@QueryMap Map<String, String> options
6. Также мы можем отправлять обьекты как тело запроса.
@POST("users/new")
Call<User> createUser(@Body User user);
Также POST запросы должны быть в формате Form-encoded
@FormUrlEncoded
@POST("user/edit")
Call<User> updateUser(@Field("first_name") String first, @Field("last_name") String last);
Если же мы добавляем кастомные обьекты в виде фоток или
файлов то необходимо использовать MultiPart
@Multipart
@PUT("user/photo")
Call<User> updateUser(@Part("photo") RequestBody photo, @Part("description") RequestBody
description);
7. ApiClient.get().groupList(userId).enqueue(object: Callback<List<User>> {
override fun onResponse(call: Call<ListDayWeather>?, response:
Response<ListDayWeather>) {
if (response.isSuccessful) {
// viewInterface?.showUserList(response.body)
} else {
// viewInterface?.showAlert()
}
}
override fun onFailure(call: Call<ListDayWeather>?, t: Throwable?) {
viewInterface?.showNoInternet()
}
})
Пример запроса.
8. Нужно в каждый запрос
добавить хедеры?
Там где билдим http клиент добавляем следующее
okBuilder.addInterceptor { chain ->
val original = chain.request()
val request = original.newBuilder()
.header("lang", Storage.get().getLang())
.method(original.method(), original.body())
.build()
chain.proceed(request)
}
9. Или если нужно повторить запрос
после неуспешного вызова.
public static <T> void enqueueWithRetry(Call<T> call, final Callback<T> callback, MainActivityInterface
activityInterface) {
call.enqueue(new RetryableCallback<T>(call, activityInterface) {
@Override
public void onFinalResponse(Call<T> call, Response<T> response) {
if (activityInterface != null) { activityInterface.onSuccess(); }
callback.onResponse(call, response);
}
@Override
public void onFinalFailure(Call<T> call, Throwable t) {
if (activityInterface != null) { activityInterface.onErrorAfterRetry(); }
callback.onFailure(call, t);
}
});
}
И вызывать при запросе
ApiClient.get().groupList(userId).enqueue
Вместо enqueue enqueueWithRetry
10. Сам RetryableCallback
public abstract class RetryableCallback<T> implements Callback<T> {
private int totalRetries = 5;
private static final String TAG = RetryableCallback.class.getSimpleName();
private final Call<T> call;
private int retryCount = 0;
MainActivityInterface activityInterface;
public RetryableCallback(Call<T> call, MainActivityInterface activityInterface) {
this.call = call;
this.activityInterface = activityInterface;
}
@Override
public void onResponse(Call<T> call, Response<T> response) {
if (!isCallSuccess(response)) {
if (retryCount++ < totalRetries) {
Log.v(TAG, "Retrying API Call - (" + retryCount + " / " + totalRetries + ")");
if (activityInterface != null) {
activityInterface.onErrorInRetry();
}
retry();
} else {
onFinalResponse(call, response);
}