使用通用图像加载器(Universal Image Loader)加载图片时,ListView加载速度非常缓慢

3

我的 listView 仅带文本时非常流畅 - 但是当我尝试加载缩略图(即使是从缓存中),它变得非常卡顿。

我正在使用 Universal Image Loader 脚本

在我的 ArticleEntryAdapter 中,代码位于 public View getView(...) 方法内:

/**
     * PHOTOS
     */
    ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder(this.mContext)
        .enableLogging()
        .memoryCacheSize(41943040)
        .discCacheSize(104857600)
        .threadPoolSize(10)
        .build();

    DisplayImageOptions imgDisplayOptions = new DisplayImageOptions.Builder()
        //.showStubImage(R.drawable.stub_image)
        .cacheInMemory() 
        .cacheOnDisc() 
        //.imageScaleType(ImageScaleType.EXACT) 
        .build();

    ImageLoader imageLoader = ImageLoader.getInstance();
    imageLoader.init(config);

    //loads image (or hides image area)
    imageLoader.displayImage("", viewHolder.thumbView); //clears previous one
    if(article.photopath != null && article.photopath.length() != 0)
    {
        imageLoader.displayImage(
            "http://img.mysite.com/processes/resize_android.php?image=" + article.photopath + "&size=150&quality=80",
            viewHolder.thumbView,
            imgDisplayOptions
            );
        viewHolder.thumbView.setVisibility(View.VISIBLE);
    }
    else
    {
        viewHolder.thumbView.setVisibility(View.GONE); //hide image
        viewHolder.thumbView.invalidate(); //should call after changing to GONE
    }

Logcat显示它正在从缓存中加载图像(我认为是这样):

ImageLoader    Load image from memory cache [http://img.mysite.com/processes/...

我正在我的三星Galaxy Nexus上测试它,并运行Android 4.0.4(尽管我的minSdkVersion =“8”)

2个回答

9
ImageLoaderConfiguration config,DisplayImageOptions imgDisplayOptions,ImageLoader imageLoader的实例化放在您的Adapter类的私有字段/成员之外。您应该只创建这些东西一次,而不是每次调用getView时都要创建。
编辑:没有看到您的整个Adapter类,这里尝试说明一下我的意思。我希望它与您所拥有的内容接近,并且您可以使其正常工作。无论如何,请让我知道。
public class MyAdapterClass extends BaseAdapter {
    /**
     * PHOTOS
     */
    static ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder(this.mContext)
        .enableLogging()
        .memoryCacheSize(41943040)
        .discCacheSize(104857600)
        .threadPoolSize(10)
        .build();

    static DisplayImageOptions imgDisplayOptions = new DisplayImageOptions.Builder()
        //.showStubImage(R.drawable.stub_image)
        .cacheInMemory() 
        .cacheOnDisc() 
        //.imageScaleType(ImageScaleType.EXACT) 
        .build();

    static ImageLoader imageLoader = ImageLoader.getInstance();
    /**
     * 
     */
    public MyAdapterClass() {
        // TODO Auto-generated constructor stub
        imageLoader.init(config);           
    }

    /* (non-Javadoc)
     * @see android.widget.Adapter#getCount()
     */
    public int getCount() {
        // TODO Auto-generated method stub
        return 0;
    }

    /* (non-Javadoc)
     * @see android.widget.Adapter#getItem(int)
     */
    public Object getItem(int position) {
        // TODO Auto-generated method stub
        return null;
    }

    /* (non-Javadoc)
     * @see android.widget.Adapter#getItemId(int)
     */
    public long getItemId(int position) {
        // TODO Auto-generated method stub
        return 0;
    }

    /* (non-Javadoc)
     * @see android.widget.Adapter#getView(int, android.view.View, android.view.ViewGroup)
     */
    public View getView(int position, View convertView, ViewGroup parent) {
        //loads image (or hides image area)
        imageLoader.displayImage("", viewHolder.thumbView); //clears previous one
        if(article.photopath != null && article.photopath.length() != 0)
        {
            imageLoader.displayImage(
                "http://img.mysite.com/processes/resize_android.php?image=" + article.photopath + "&size=150&quality=80",
                viewHolder.thumbView,
                imgDisplayOptions
                );
            viewHolder.thumbView.setVisibility(View.VISIBLE);
        }
        else
        {
            viewHolder.thumbView.setVisibility(View.GONE); //hide image
            viewHolder.thumbView.invalidate(); //should call after changing to GONE
        }
    }

}

1
另外,如果您正在调试模式下运行,它会减慢很多东西。 - petey
@forgivegod.. 我也遇到了同样的问题.. 你能告诉我如何放置这些类的实例化吗?我已经在构造函数中使用它了。但是它没有起作用。请发送适配器片段给我.. srikanth.gnani@gmail.com。谢谢。 - wolverine
我编辑了我的回答,以帮助你@wolverine。HTH有所帮助。抱歉回复晚了。飓风桑迪之类的事情。这是我一周内第一次没有移动浏览器上网。 - petey

2

我可能错了,但是当我遇到这个问题时,我观察到使用较小尺寸的图像可以极大地提高速度。以前我使用的图像大小超过150KB,我将它们切换到每个约10个,结果完美无缺。这只是对上述思路的补充,以后进行优化可能会有所帮助。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接