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