ANR на самом деле не проблема памяти, это проблема с выполнением чего-либо в потоке пользовательского интерфейса («основной» в отладчике), которое занимает слишком много времени.Любая работа, которую вы выполняете в потоке пользовательского интерфейса, должна быть быстрой или запускать сторожевой таймер ANR.Длительный процесс, который вы выполняете, приводит к тому, что его нужно поместить в другой поток.
Вам нужно перенести работу, которую вы выполняете, чтобы вычислить фоновое изображение, в отдельный поток.Я бы посоветовал вам использовать подход загрузки действия с помощью только счетчика прогресса и запуска фонового потока, тогда у вас есть все, чтобы фактически отобразить пользовательский интерфейс, скрыть счетчик и показать виды, для которых вы хотите установить фоновое изображение.
Обратите внимание, что вы можете вносить изменения только в представления из потока пользовательского интерфейса, например, вызывая API View.setBackgroundDrawable(...)
, но вы можете создать Drawable в фоновом потоке, а затем установить его из потока пользовательского интерфейса.AsyncTask хорош для такой схемы работы.Если вы не используете AsyncTask
, то вы будете использовать API Activity.runOnUiThread(...)