0

我正在使用列表视图来显示数据,在列表视图中我在每个列表项中使用图像。

我正在关注本教程 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();
                }

            });

这对于延迟加载图像看起来不错,但有一个问题,它不会显示任何图像,直到用户触摸屏或尝试滚动结果或用户与手机设备键进行任何交互。

如果我尝试滚动结果,它会显示所有列表项图像......可能会出现什么问题???

4

1 回答 1

1

没有更多的上下文很难说。特别是,这段代码是从哪里调用的,getImageIcon() 是做什么的?

我看到的一个问题是您在后台线程中而不是在 UI 线程中设置图像图标。这可能是在 ui 事件触发刷新之前它似乎不会改变的原因。尝试将 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();

如果我是对的,那应该可以解决问题。

如果这确实有效,那就太好了,尽管我认为您的代码可以进行一些清理。假设这一切都发生在 UI 线程中(考虑到您在此线程中实例化一个新的 Handler,这可能是真的),您根本不需要使用 Handler,也不需要创建一个新的可运行。只需将它们剥离并直接创建一个新的 DownloadImage 实例并调用 execute()。

于 2009-12-15T08:37:12.583 回答