【问题标题】:Android-Universal-Image-Loader :: Loading images on GridViewAndroid-Universal-Image-Loader :: 在 GridView 上加载图像
【发布时间】:2012-11-11 03:59:30
【问题描述】:

我正在尝试开发壁纸应用程序。当应用程序启动时,活动会在 gridView 上显示类别(文本视图上的图像和相应名称)。当我选择一个类别时,它会导航到一个子类别。在子类别活动中,它还会在 textVew 上显示具有相应名称的子类别图像。 问题在于子类别活动图像未加载。有时它会加载图像;当我按下后退按钮,然后再次选择该子类别时,它会加载三种模式图像;按下后退按钮并选择子类别会导致加载另外三个图像(现在总共 10 个图像)。 图像已正确缓存在磁盘上。 这是我的配置:

   cacheDir = new File(Environment.getExternalStorageDirectory(),
                    "peakwallpapers/cache"); // --
            // Create configuration for ImageLoader
            config = new ImageLoaderConfiguration.Builder(this).enableLogging()
                    .discCache(new UnlimitedDiscCache(cacheDir))
                    .memoryCache(new UsingFreqLimitedMemoryCache(2000000))
                    .denyCacheImageMultipleSizesInMemory().threadPoolSize(10)
                    .threadPriority(Thread.MIN_PRIORITY + 2)
                    .defaultDisplayImageOptions(DisplayImageOptions.createSimple())
                    .build(); // --

            options = new DisplayImageOptions.Builder()
                    .showStubImage(R.drawable.stub_image)
                    .showImageForEmptyUri(R.drawable.image_for_empty_url)
                    .cacheInMemory().cacheOnDisc().build();
            imageLoader.init(config);

这是 getView() 方法:

   @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            final View rowView;
            final ViewHolder viewHolder = new ViewHolder();
            if (convertView == null) {
                rowView = getLayoutInflater().inflate(
                        R.layout.item_sub_category_grid, null);

                viewHolder.imageView = (ImageView) rowView
                        .findViewById(R.id.image_item_sub_category);
                viewHolder.textView = (TextView) rowView
                        .findViewById(R.id.text_item_sub_cat_desc);

                rowView.setTag(viewHolder);

            } else {
                rowView = (View) convertView;
            }

            ViewHolder holder = (ViewHolder) rowView.getTag();
            holder.textView.setText(wpSubCategories.get(position)
                    .getSubCategoryName());

            imageLoader.displayImage(imageUrls[position], viewHolder.imageView,
                    options, new SimpleImageLoadingListener() {
                @Override
                public void onLoadingStarted() {
                    showLoading();
                }
                        @Override
                        public void onLoadingComplete(Bitmap loadedImage) {
                            Animation anim = AnimationUtils.loadAnimation(
                                    SubCategoryGridActivity.this,
                                    R.anim.fade_in);
                            viewHolder.imageView.setAnimation(anim);
                            anim.start();
                        }
                    });

            return rowView;
        }
    }

我的网格布局:sub_category_grid.xml:

<?xml version="1.0" encoding="utf-8"?>
<GridView xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/gridview_sub_category"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:gravity="center"
    android:horizontalSpacing="4dip"
    android:numColumns="2"
    android:verticalSpacing="4dip" />

和我的网格项目:item_sub_category_grid.xml:

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/frame_l_item_sub_category_item"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_weight=".5"
    android:background="@drawable/textlines" >

    <ImageView
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:id="@+id/image_item_sub_category"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:adjustViewBounds="true"
        android:contentDescription="@string/descr_image"
        android:scaleType="centerCrop" />

    <TextView
        android:id="@+id/text_item_sub_cat_desc"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_gravity="bottom"
        android:background="@drawable/cat_bg"
        android:gravity="center_horizontal"
        android:text="TextView"
        android:textColorHighlight="#656565"
        android:typeface="monospace" >
    </TextView>

</FrameLayout>

注意:LogCat 上没有显示错误。

【问题讨论】:

    标签: android universal-image-loader


    【解决方案1】:

    首先,我认为您的线程池大小太大。当然,这取决于您的应用所针对的设备。但它在非现代设备上运行速度会非常慢。我认为5就足够了,但是您应该自己测试一下。改变线程池大小和线程优先级以实现最佳速度和性能。

    第二:您的getView() 方法存在逻辑错误。移动 final ViewHolder viewHolder = new ViewHolder(); 后 if (convertView == null) { 你会看到问题所在。您的变量 viewHolder 和 holder 在逻辑上相互重叠。

    UPD:如果这样做,请不要在活动的onStop() 中调用 ImageLoader.stop()。

    【讨论】:

      猜你喜欢
      • 2013-07-15
      • 2020-03-24
      • 2013-10-17
      • 1970-01-01
      • 1970-01-01
      • 2019-01-13
      • 1970-01-01
      • 2017-09-08
      • 2014-05-19
      相关资源
      最近更新 更多