Да. Вы должны избегать работы в потоке пользовательского интерфейса в максимально возможной степени. Когда вы находитесь в getView (), вы находитесь в потоке пользовательского интерфейса. Чтобы вырваться, сделайте это:
new Thread(new Runnable(){
public void run() {
// your code here
}}).start();
Затем, когда вам нужно каким-то образом изменить представление, вернитесь к потоку пользовательского интерфейса следующим образом:
runOnUiThread(new Runnable(){
public void run() {
// your view-modifying code here
}});
.. или используйте механизм View.post ().
В вашем примере, что произойдет, это то, что элемент будет показан на экране, прежде чем изображение станет доступным для отображения. Я предлагаю использовать спиннер «loading» или другой заполнитель, чтобы указать пользователю, что происходит.
На практике вы можете использовать такое гнездо несколько раз, хотя вы достигнете точки, в которой упростится конструкция. Анонимные классы могут быть неэффективными с точки зрения памяти, а запуск множества потоков без механизма отмены может иметь свои недостатки.
Вы можете столкнуться с некоторыми трудностями в качестве побочного эффекта изменения представлений после выхода из getView (). Некоторые представления могут нуждаться в вызове invalidate (), чтобы изменения вступили в силу. Также будьте осторожны, если вы перерабатываете представления в вашем getView (), вы должны убедиться, что к тому времени, когда ваш код, изменяющий представление, выполняется, представление все еще используется для контента, который вы применяете. setTag () / getTag () полезен здесь для хранения некоторого идентификатора данных, которые вы можете позже проверить, чтобы убедиться, что ваш View не был переработан.