2011-12-30 9 views
1

私は冗長な質問を投稿するのが嫌いですが、ヒープ上にビットマップメモリ​​をあまり持たない方法を私の人生では理解できません。最初のonCreateで完全に膨張しますが、2回目は失敗します。どこで/いつ私はこれらのものをリサイクルするのですか?リストビューの人口、ビットマップメモリ​​リーク

私は基本的にビットマップの配列リストを使用しています。これをカスタム行レイアウトのアダプタに設定し、getViewをオーバーライドします。

**使用されているビットマップは、SDカードの// jpegです。//基本的に垂直スクロールするギャラリーです。

 mInflater = (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     setListAdapter(getAdapter()); 
    }//on create 


    private ArrayAdapter<Bitmap> getAdapter(){ 
     ArrayList<Bitmap> picsII = new ArrayList<Bitmap>(); 
     String DIRECTORY_PATH = "/sdcard/Mustaches/"; 
     File file = new File(DIRECTORY_PATH); 
     final String[] s = file.list(); 

     for(int i = 0; i<s.length; i++){ 
      Bitmap b = BitmapFactory.decodeFile(DIRECTORY_PATH + s[i]); 
      picsII.add(b); 
     } 
     adapter = new ArrayAdapter<Bitmap>(this, R.layout.row, picsII){ 

      @Override 
      public View getView(int position, View convertView, ViewGroup parent) { 
      View row; 

      if (null == convertView) { 
      row = mInflater.inflate(R.layout.row, null); 
      } else { 
      row = convertView; 
      } 


      ImageView iv = (ImageView) row.findViewById(R.id.imageView_row); 
      iv.setImageBitmap(getItem(position)); 

      //some other widgets such as buttons and textviews 
      //from the custom row are inflated here 


      return row; 
      } 
     }; 

     return adapter; 
    }; 
+0

エラーはOut of Memoryエラーですか? – Samuel

+0

はい、outOfMemoryError:ビットマップがVM予算を超えています(heapSize = 5639 Allocated = 3052 bitmapSize = 27141) – kleaver

答えて

1

問題は、一度に複数のビットマップを表示している可能性がある場合に、すべてのビットマップを熱心に読み込んでいることです。

これは、すべてのビットマップを表示する前にデコードすることです。これにより、すべてのメモリが簡単に使い尽くされます。

あなたが使用したいアプローチは、表示されているListView行の画像をロードするだけです。

画像をバックグラウンドスレッドにロードしてキャッシュを維持するより良い解決方法については、この記事を参照してください。

http://android-developers.blogspot.com/2010/07/multithreading-for-performance.html