ListItem lazyload AsyncTask图像显示问题

时间:2009-12-15 05:44:40

标签: android listitem

我正在使用listview来显示数据,在listview中我正在每个上下文中使用图像。

我正在学习本教程 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 个答案:

答案 0 :(得分: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,也不需要创建一个新的Runnable接口。只需将它们剥离并直接创建一个新的DownloadImage实例并调用execute()。