2

壁紙アプリケーションを開発しようとしています。アプリケーションが起動すると、アクティビティは gridView にカテゴリ (textView 上の画像と対応する名前) を表示します。カテゴリを選択すると、サブカテゴリに移動します。サブカテゴリ アクティビティでは、サブカテゴリの画像とそれに対応する名前が textVew に表示されます。問題は、サブカテゴリ アクティビティの画像が読み込まれないことです。画像をロードすることもあります。戻るボタンを押して、そのサブカテゴリをもう一度選択すると、3 つのモードの画像が読み込まれます。戻るボタンを押してサブカテゴリより選択すると、別の 3 つの画像 (合計 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 ではエラーは表示されません。

4

1 に答える 1

4

まず、スレッドプールのサイズが大きすぎると思います。もちろん、それはあなたのアプリがターゲットにしているデバイスに依存します。ただし、最新ではないデバイスでは動作が非常に遅くなります。5で十分だと思いますが、自分でテストする必要があります。最高の速度とパフォーマンスを実現するには、スレッドプールのサイズとスレッドの優先度を変更します。

第二に:あなたはあなたのgetView()方法に論理的な間違いがあります。final ViewHolder viewHolder = new ViewHolder(); 後 に移動 if (convertView == null) { すると、問題が発生します。あなたの変数viewHolderholderは論理的に互いに重なり合っています。

UPD:アクティビティでImageLoader.stop()を呼び出さないでonStop()ください。

于 2012-11-11T08:39:46.967 に答える