Несколько потоков в деятельности / сервисе Android - PullRequest
4 голосов
/ 14 октября 2010

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

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

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

Ответы [ 2 ]

6 голосов
/ 22 октября 2010

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

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

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

Надеюсь, это кому-нибудь поможет.

5 голосов
/ 14 октября 2010

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...