Когда я хочу какой-то код выполнить так, чтобы не замедлить main поток, как выбрать, создать поток или корутину?
Какими особенностями должен обладать код, чтобы я мог уверенно сказать, что он должен быть в корутине, а не в другом потоке, и наоборот?
Создавать поток рукам тебе вообще никогда не нужно. На самый крайний случай - использовать пул потоков.
Если ты используешь корутины - используй корутины. С правильным диспатчером. В твоём случае подойдёт запуск на Dispatchers.Default. Там как раз пул потоков на JVM под капотом.
Щас у меня все с ног на голову перевернулось, где бы я не читал, везде пишется примерно одно и тоже: любые действия, не связанные с UI, нужно выполнять в отдельном потоке, так же и всю работу с бд или сетью. А тут вы говорите, что создавать потоки не нужно. Что вы имеете ввиду?
foonfyrick, тебе Roman Kitaev правильно указал. Да, надо делать в бекграунде. Но создавать потоки самому не надо. Потому что это сложно. На сырых потоках вообще никто никогда ничего не пишет (тем не менее, знать их надо, вот такой финт ушами).
Это могут быть шедулеры в RxJava. Там внутри пулы потоков.
Это могут быть диспетчеры в корутинах.
Там внутри тоже пулы потоков. Потому что JVM ничего про корутины на данный момент не знает.
Ходить в сеть стоит через OkHttp и Retrofit. Там есть асинхронные вызовы, и отдельно никакие потоки переключать не надо.
Денис Загаевский, я теперь окончательно запутался, зачем показывают как создавать потоки, если ими никто не пользуется, зачем в книгах пишут что нужно в этих потоках писать весь код, который замедляет майн поток, если ими никто не пользуется, где тогда вообще код писать? На лекции майл ру вообще сказали, что методы, время выполнения которых превышает 100 млс, нужно выполнять в отдельном потоке, и как мне в отдельном потоке создать, если вы говорите что это сложно, и тем более он должен быть не сырым, что вообще такое сырой поток? Thread{}.start() это сырой поток?
foonfyrick, да, это сырой поток. Гугли, ключевые слова я дал.
Ещё раз - да, нужно выносить код в бекграунд треды. Нет, не нужно делать Thread{}.start(). Создание и старт потока это дорого. Пул потоков, и дальнейшие обертки над ним. Вчитывайся в то, что я тебе написал.
100мс это много, кадр мейнтреда это 16мс. 6-7 кадров пропуска. Такой лаг пользователь уже увидит.
Денис Загаевский, А что значит дорого, слово дорого я очень часто слышу, но не понимаю, это значит памяти много на его создание выделяется или что-то еще? Если да, то как узнать насколько дорого, если у меня будут 2 варианта кода, как я пойму какой дороже?
foonfyrick, выделение ресурсов занимает сравнительно много времени. Потоки нужно переиспользовать.
у меня будут 2 варианта кода, как я пойму какой дороже?
Для этого и надо знать всё то, что спрашивают на собеседованиях. Алгоритмы. Сырые треды. Детали реализации JVM. И так далее, и тому подобное.
Если ты придешь ко мне на собеседование, расскажешь, что используешь корутины, но не будешь понимать, как они работают, и не будешь понимать, что внутри Dispatchers.Default тредпул, и не будешь знать, что такое тредпул, то считай, что корутины ты не знаешь.