2012-11-11 42 views
2

我正在嘗試開發壁紙應用程序。當應用程序啓動時,一個活動顯示gridView上的類別(一個圖像和一個textView上的對應名稱)。當我選擇一個類別時,它會導航到一個子類別。在子類別活動中,它還在textVew上顯示子類別圖像及其對應名稱。 問題是在子類活動圖像未加載。有時會加載一個圖像;當我按下後退按鈕,然後再次選擇該子類別時,它會加載三個模式圖像;按下後退按鈕並選擇子分類會導致加載另外三張圖像(現在總共10張圖像)。 圖像正確緩存在磁盤上。 這裏是我的配置:Android-Universal-Image-Loader ::在GridView上加載圖像

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()methood:

@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> 

N.B:它在LogCat上顯示沒有錯誤。

回答

4

首先,我認爲你的線程池太大了。當然,這取決於你的應用的目標設備。但在非現代設備上它的運行速度非常慢。我認爲5就夠了,但你應該自己測試一下。改變線程池大小和線程優先級以實現最佳速度和性能。

其次:您在getView()方法中存在邏輯錯誤。移動 final ViewHolder viewHolder = new ViewHolder();if (convertView == null) { 你會看到問題。你的變數viewHolderholder邏輯上彼此重疊。

UPD:如果需要,請勿在活動的onStop()中調用ImageLoader.stop()。

+0

我已經停止調用ImageLoader.stop()...它的工作原理:) – ratulalahy

+0

已添加回答。 – NOSTRA