Несколько потоков в активности / услуге Android

У меня есть приложение для Android, где в представлении списка для каждого элемента в списке я загружаю изображение из сети в отдельный поток. Поэтому, если в представлении списка отображается 8 элементов, активность будет пытаться запустить 8 разных потоков, по одному для каждого элемента списка, чтобы загрузить изображение. Когда вы прокрутите список вниз, количество потоков может увеличиться, если предыдущие потоки не закончили выполнение.

Мне любопытно узнать, сколько одновременных потоков может выполнить одно приложение для Android одновременно? Есть ли предел? Я бы не ожидал, что эти потоки вызовут ANR через медленное интернет-соединение, поскольку они независимы? Но похоже, что ANR действительно происходит, и может быть, это связано с тем, что приложение / устройство не работают на ресурсах, поэтому для создания новой активности в пользовательском интерфейсе требуется более 5 секунд, что приводит к ANR?

Любые подсказки о том, как я могу лучше реагировать на медленное подключение к Интернету, будут оценены.

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

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

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

    Позже я узнал, что мое приложение зависало и замедлялось не потому, что было слишком много потоков, порожденных им. Но это было из-за того, что я использовал Service, а не IntentService. И моя сеть IO происходила в основном потоке в Сервисе. Это означает, что блокирующий IO будет подавлять основной поток, и телефон / приложение будет стремиться умереть и отображать ANR.

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

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

    Надеюсь, что это помогает кому-то.