ListItem lazyload AsyncTask проблема с отображением изображения - PullRequest
0 голосов
/ 15 декабря 2009

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

Я следую этому уроку http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/List4.html

new Handler().post(new Runnable(){

                @Override 
                public void run() {
                    //Need to subclass to use Asynctask
                    class DownloadImage extends AsyncTask<Void, Void, Void>{
                        @Override
                        protected Void doInBackground(Void... params) {
                                Drawable dImage = Util.getImageFromURL(imageURL); 
                                    getImageIcon().setImageDrawable(dImage);
                            return null;
                        }

                    }
                    new DownloadImage().execute();
                }

            });

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

Если я пытаюсь прокрутить результаты, отображаются все изображения элементов списка ... что может пойти не так ???

1 Ответ

1 голос
/ 15 декабря 2009

Трудно сказать без контекста. В частности, откуда вызывается этот код и что делает getImageIcon () ??

Одна проблема, которую я вижу, заключается в том, что вы устанавливаете значок изображения в фоновом потоке, а не в потоке пользовательского интерфейса. Это может быть причиной того, что она, похоже, не изменится, пока событие пользовательского интерфейса не вызовет обновление. Попробуйте изменить DownloadImage на что-то вроде следующего:

class DownloadImage extends AsyncTask<Void, Void, Drawable>{
        @Override
        protected Drawable doInBackground(Void... params) {
            return Util.getImageFromURL(imageURL); 
        }

        @Override
        protected void onPostExecute( Drawable d ) {
            getImageIcon().setImageDrawable(d);
        }

}
new DownloadImage().execute();

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

Если это сработает, отлично, хотя я думаю, что ваш код может использовать небольшую очистку. При условии, что все это происходит в потоке пользовательского интерфейса (что, вероятно, верно, учитывая, что вы создаете новый обработчик в этом потоке), вам вообще не нужно использовать обработчик, а также не нужно создавать новый Runnable. Просто удалите их и создайте новый экземпляр DownloadImage напрямую и вызовите execute ().

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