Задать вопрос
  • RxJava. Почему не срабатывает данный код?

    zagayevskiy
    @zagayevskiy Куратор тега Java
    Android developer at Yandex
    Вангую, что isConnectionAvailable() возвращает бесконечный Observable, поэтому switchIfEmpty не сработает.
    Ответ написан
  • Под какие экраны нарисовать дизайн для Android устройств?

    zagayevskiy
    @zagayevskiy Куратор тега Android
    Android developer at Yandex
    Обычно рисуют тянущийся дизайн. Есть элементы, размеры которых задаются в dp/sp, остальное должно тянуться. Выбирают какой-то экран и рисуют для него, а рисовать под миллион экранов смысла нет.
    Ответ написан
    1 комментарий
  • Почему нельзя отобразить AlertDialog сразу в активити?

    zagayevskiy
    @zagayevskiy Куратор тега Android
    Android developer at Yandex
    В восстановлении состояния при смене конфигурации и открытии из списка недавних приложений. Диалог фрагмент восстановит всё сам, просто Алерт диалог - нет, и надо будет отдельно делать приседания с бубном вокруг него.
    Ответ написан
    1 комментарий
  • Как именно работает map?

    zagayevskiy
    @zagayevskiy Куратор тега Java
    Android developer at Yandex
    size всего лишь возвращает, сколько ключей реально лежит в папке.
    Все твои рассуждения про "завели бакет", "кладем в новый бакет" неверны. Ты ничего не заводишь, это детали реализации хеш-таблицы. Бакет это связный список, в котором лежат пары ключ-значение, у которых хеш ключа равен по модулю количества бакетов. Это и есть тот список, который ты мечтаешь получить, и это так не работает. То есть ты его не получишь, тк это детали реализации.
    И далее, ты эту реализацию сломал своими мутабельными ключами. В списке теперь лежит ключ, у которого хеш не соответствует списку. Естественно, мапа не найдет по этому ключу ничего, тк будет искать в другом списке(бакете). Вывод - никогда не мутируй ключи.

    //заводим бакет который который будет всегда первым
    map.put(null, null);
    //значение перетерлось так как hashCode одинаков и equals вернул true
    map.put(null, "afterNull");


    Нет, всё не так. Нулл обрабатывается просто отдельно, под него отдельный элемент, это не бакет.

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

    Сколько в данный момент в мапе бакетов тебя вообще заботить не должно.

    Читай код. Видно, что ты где-то нахватался неправильно (или плохо) разжеванной теории, и пытаешься на этом выехать. Большинство твоих вопросов снимут сорсы хешмапы и, в крайнем случае, дебаггер.
    Ответ написан
    3 комментария
  • Java или Kotlin для новичка Android?

    zagayevskiy
    @zagayevskiy Куратор тега Java
    Android developer at Yandex
    На данный момент уже можно советовать начинать с котлина, поглядывая по необходимости в джаву. Котлин достаточно самостоятельный язык, и Kotlin/JVM это одна из реализаций.
    Ответ написан
    2 комментария
  • Как изменить видимость кнопки в одной активности через другую активность?

    zagayevskiy
    @zagayevskiy Куратор тега Java
    Android developer at Yandex
    1) не надо для этого использовать активити, используй фрагменты;
    2) если очень хочется, используй startActivityForResult + onActivityResult. Активити инстансы друг друга не должны видеть ни при каких обстоятельствах. Так что "поменять видимость в другой активити", как бы просто это ни казалось, нельзя.
    Ответ написан
    2 комментария
  • Как вернуть Object в методе, когда закончится работа RxJava?

    zagayevskiy
    @zagayevskiy Куратор тега Java
    Android developer at Yandex
    Ну можно вызвать toBlocking(), но это в корне неправильно. Возвращай дальше Observables, иначе нафига там вообще rx?
    Ответ написан
    7 комментариев
  • Практично ли передавать объекты в качестве параметра другому контроллеру в Conductor?

    zagayevskiy
    @zagayevskiy Куратор тега Java
    Android developer at Yandex
    Никакого смысла в том, что ты сделал, нет. Ничего не сохранится при пересоздании. Более того, оно упадёт, тк ты не сделал пустой конструктор.
    Аргументы нужно передавать через бандл getArgs().
    Сохранять в shared preferences тупо, тк это персистентное хранилище.
    Ответ написан
  • Сохраняет ли Android данные приложения при вынужденной выгрузке?

    zagayevskiy
    @zagayevskiy Куратор тега Android
    Android developer at Yandex
    Вообще смотря, что считать состоянием. Если активити убрать в фон, вызовется onSaveInstanceState, если приложение убьёт система, то при восстановлении из списка недавно открытых, вызовется onRestoreInstanceState. Соответственно, если сохранить всё нужное, то оно и восстановится. Примерно это происходит при don't keep activities.
    Всякие синглтоны, статика, сохранённое в аппликейшн, вообще говоря, потеряется.
    Ответ написан
    4 комментария
  • Сколько FPS у нативных Android-приложений?

    zagayevskiy
    @zagayevskiy Куратор тега Android
    Android developer at Yandex
    В целом можно считать, что 60. На отрисовку одного кадра даётся 16мс. Если сделать вьюху, которая каждый кадр меняет фон, и зовёт invalidate(), то будет 60 кадров.
    Естественно, там куча оптимизаций на тему "не рисовать то, что не нужно обновлять", поэтому у обычной вьюхи onDraw зовётся только когда её реально надо перерисовать.

    Вообще тема довольно обширная, нужна конкретика, что именно интересует.

    Посмотри по теме:
    https://youtu.be/CaMTIgxCSqU
    https://youtu.be/WH9AFhgwmDw
    https://youtu.be/we6poP0kw6E
    Ответ написан
    Комментировать
  • Можно ли расположить индикатор загрузки по центру LinearLayout?

    zagayevskiy
    @zagayevskiy Куратор тега Android
    Android developer at Yandex
    Да, нужен другой лэйаут. Линеар располагает элементы линейно. Самый простой способ - запихать всё во FrameLayout, в него же положить прогресс выше, чем линеар.

    В конкретном случае, конечно, надо смотреть. Может там и констрейнт можно поюзать, а может и не надо.
    Ответ написан
    1 комментарий
  • Как скрыть элемент (TextView) в RecyleView?

    zagayevskiy
    @zagayevskiy Куратор тега Java
    Android developer at Yandex
    берешь в onBindViewHolder и в тех элементах, где надо скрыть, ставишь visibility GONE, а в тех, где не надо - VISIBLE.
    Ответ написан
    3 комментария
  • Нужна ли проверка Map на null?

    zagayevskiy
    @zagayevskiy Куратор тега Java
    Android developer at Yandex
    Для того, чтобы не возникало таких вопросов, рекомендую все методы, аргументы и поля помечать @NonNull и @Nullable.
    Все поля и локальные переменные, которые по логике не изменяются - final.
    Объявление переменных максимально близко к месту их использования.

    Ответ на вопрос - нет, в данном случае проверять не надо. А вот если метод библиотечный и не помечен аннотацией - надо.

    Ещё лучше взять Kotlin и не мучаться:)
    Ответ написан
    Комментировать
  • Актуальна ли статья "Teach Yourself Computer Science"?

    zagayevskiy
    @zagayevskiy
    Android developer at Yandex
    SICP не устареет никогда:)
    Другое дело, начинать обучение с функциональщины и интерпретатора лиспа... Так себе идея, имхо.
    Ответ написан
    Комментировать
  • Как внедрять реализации интерфейса с помощью Dagger2?

    zagayevskiy
    @zagayevskiy Куратор тега Android
    Android developer at Yandex
    В билдере компонента сделай метод (название не важно)
    @BindsInstance
    fun bindInteractor(interactor: SavedListInteractor): Builder

    когда будешь создавать компонент во фрагменте, вызовешь этот метод

    https://dagger.dev/api/2.10/dagger/BindsInstance.html

    Ещё можно сделать примерно так:
    @Qualifier
    annotation class MyFlag
    
    @Component(modules = [InteractorModule::class])
    interface MyComponent {
        @Component.Builder
        interface Builder {
            @BindsInstance
            fun bindMyFlag(@MyFlag flag: Int): Builder
            fun build(): MyComponent
        }
        ...
    }
    
    @Module
    object InteractorModule {
        @Provides 
        fun provideInteractor(@MyFlag flag: Int, impl0: Provider< FavoritedListImpl>, impl1: Provider< IgnoredListImpl>): SavedListInteractor = when (flag) {
            0 -> impl0.get()
            1 -> impl1.get()
            else -> throw IllegalArgumentExcepion("Unknown flag: $flag")
        }
    }


    То есть в граф суём аннотированный флаг, который приходит в аргументы(можно обойтись без аннотации, но покарают боги даггера - хуже неименованного инта в графе только неименованный инт в шине событий. Не комильфо, короче). Потом по этому флагу лениво разруливаем, какую реализацию отдать
    Ответ написан
  • Как определить какой элемент списка привязан к конкретному холдеру?

    zagayevskiy
    @zagayevskiy Куратор тега Android
    Android developer at Yandex
    В onBindViewHolder cохраняй в холдер элемент(или его позицию, но элемент удобнее).
    Ответ написан
    Комментировать
  • Есть ли у кого маленькая шпаргалка по перебору связного списка?

    zagayevskiy
    @zagayevskiy
    Android developer at Yandex
    Собеседование надо проходить, думая головой, а не запоминая какие-то бредовые шаблоны. Цель заебывания тебя этими списками не в том, чтобы узнать, что ты помнишь шаблоны , а в том, чтобы посмотреть, как ты "крутишь" код в голове.
    Ответ написан
    Комментировать
  • Что нужно изучать начинающему Android программисту помимо языка программирования?

    zagayevskiy
    @zagayevskiy Куратор тега Java
    Android developer at Yandex
    Я начинал примерно в твоём возрасте, у меня не было интернета, и был Турбо Паскаль 7.0(+ книжка по нему), а чуть позже - Делфи.

    Совет такой - бери популярный язык (джава, С#, питон, котлин), изучай его по каким-нибудь курсам, книгам, статьям. С++ тут очень не рекомедую.

    Изучив маломальские основы, иди на codeforces 3 дивизион, и начинай решать задачки. Также можно решать hackerrank. Для развлечения - codewars, codefighters(не знаю, живы ли они ещё).

    Если учишься в школе - постарайся поучаствовать в олимпиадах, но без фанатизма, цели стать золотым призером мировой олимпиады у тебя нет. Я обычно брал 1-2 места на районе и в городе-миллионнике и на этом всё. Цель тут - порешать задачки в стрессовой ситуации, набить руку, и понять, чего ты стоишь.
    К 10-11 классу ты должен легко писать типовые школьные задачки.

    Если в твоём городе есть Яндекс Лицей, и ты проходишь по возрасту, постарайся туда попасть.

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

    После школы поступай в хороший ВУЗ, на факультет, связанный с программированием. Тут я традиционно рекомендую ВМК МГУ, ФПМК ТГУ, Бауманку, МФТИ, СПбГУ, ИТМО. Да, сейчас множество людей говорят, что ВУЗ не нужен. Но это очень зависит от ВУЗа. Шарага, где учат пхп и интернет-магазин в качестве курсовой, действительно не нужна. Хороший ВУЗ даёт базу, учит думать, потом можно говорить с коллегами на одном языке. В нашей команде я не знаю никого, кто не закончил бы ВУЗ. Ещё даёт попробовать разные языки программирования. Я изучал примерно 7-8 языков за 5 лет. Да, использую из них 2-3. Но уже на работе, впервые увидев php или Ruby, сразу сделать в нём правки, и увидеть, что код написан плохо - бесценно.

    Не называй себя начинающим андроид разработчиком! Ты ещё ничего не пробовал! Я понял, что хочу заниматься андроидом, когда уже лет 5-6 программировал. Ты можешь понять, что хочешь заниматься чем-то другим.

    Прими как факт, что в ближайшие 3-4 год тебе не на чем заработать. Ну если только не клепать интернет-магазины за копейки, но это путь в никуда.
    Ответ написан
    2 комментария
  • Как получают два вида производной, на примере сигмоида?

    zagayevskiy
    @zagayevskiy
    Android developer at Yandex
    Производная частного равна разности произведения производной числителя на знаменатель и произведения числителя на производную знаменателя, деленной на квадрат знаменателя.

    (1/(1 + е^-х))'
    = (1' * (1 + е^-х) - 1 * (1 + е^-х)')/(1 + е^-х)^2 #по формуле производной частного
    =( 0 * (...) - 1' + (е^-х)' )/(1 + е^-х)^2 #по формуле производной суммы
    = (- e^-x * (-x)')/(1 + е^-х)^2 #по формуле производной экспоненты
    = (e^-x)/(1 + е^-х)^2

    Дальше
    f(x) = 1/(1 + е^-х)
    (e^-x)/(1 + е^-х)^2
    = (e^-x)/(1 + е^-х) * 1/(1 + е^-х)
    = (e^-x)/(1 + е^-х) * f(x)
    = (-1 + 1 + e^-x) / (1 + e^-x) * f(x)
    = (-1 + (1 + e^-x)) / (1 + e^-x) * f(x)
    = ((-1 / (1 + e^-x) + (1 + e^-x)/(1 + e^-x)) * f(x)
    = (1 - (1/(1 + e^-x))) * f(x)
    = (1 - f(x)) * f(x)

    То есть это никакой не "другой способ вычисления производной в МЛ", это просто преобразования производной этой конкретной функции.

    Подробнее изучить в учебнике по математике за 8-11 класс.
    Ответ написан
    3 комментария