2014-03-26 68 views
1

時,當我嘗試滾動從SD卡更多圖片它顯示java.lang.OutOfMemoryErrorjava.lang.OutOfMemoryError加載圖像

java.lang.OutOfMemoryError 
at android.graphics.BitmapFactory.nativeDecodeAsset(Native Method) 
at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:502) 
at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:601) 
at net.altnetwork.accountability.helpers.ScreenshotLibrary$LibraryItem.getBitmap(ScreenshotLibrary.java:124) 
at net.altnetwork.accountability.helpers.ScreenshotLibrary$ItemGroup.getBitmaps(ScreenshotLibrary.java:102) 
at net.altnetwork.accountability.v2.GalleryAdapter.getView(GalleryAdapter.java:127) 
at android.widget.AbsListView.obtainView(AbsListView.java:2143) 

at android.widget.ListView.makeAndAddView(ListView.java:1831) 

at android.widget.ListView.fillSpecific(ListView.java:1320) 

at android.widget.ListView.layoutChildren(ListView.java:1630) 

at android.widget.AbsListView.onTouchEvent(AbsListView.java:3348) 

at android.view.View.dispatchTouchEvent(View.java:7246) 

at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2168) 
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1903) 

at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2174) 
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1917) 

at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1917) 

at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2174) 

at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1917) 


at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2174) 

at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1917) 
at com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchTouchEvent(PhoneWindow.java:1953) 

at com.android.internal.policy.impl.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1405) 

at android.app.Activity.dispatchTouchEvent(Activity.java:2410) 

at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchTouchEvent(PhoneWindow.java:1901) 
at android.view.View.dispatchPointerEvent(View.java:7426) 

at android.view.ViewRootImpl.deliverPointerEvent(ViewRootImpl.java:3220) 

at android.view.ViewRootImpl.deliverInputEvent(ViewRootImpl.java:3165) 

at android.view.ViewRootImpl.doProcessInputEvents(ViewRootImpl.java:4292) 

at java.lang.refl 
    Force finishing activity net.altnetwork.accountability/.activities.HomeActivity 

這是類文件......

public class GalleryAdapter extends BaseAdapter implements OnItemClickListener { 

private Context mContext; 
private int numcolumn; 
private int NoOfListItem; 
GridView grid; 
int ListItemHeight; 
private String[] header; 
SharedPreferences groupbyPref; 
private SharedPreferences GalleryPref; 
ScreenshotLibrary myScreenshotLibrary = null; 

public GalleryAdapter(Context gallery, int NumOfListItem, String[] str) { 
    SharedPreferences ImageSizePref = PreferenceManager 
      .getDefaultSharedPreferences(gallery); 
    numcolumn = ImageSizePref.getInt("NoOfColumn", 5); 
    GalleryPref = PreferenceManager.getDefaultSharedPreferences(gallery); 

    Editor edit = GalleryPref.edit(); 
    edit.putInt("NumOfListItem", NumOfListItem); 
    edit.commit(); 

    this.header = str; 
    this.mContext = gallery; 

    this.ListItemHeight = GalleryPref.getInt("ListHeight", 1000); 
    this.NoOfListItem = GalleryPref.getInt("NumOfListItem", 5); 

    groupbyPref = PreferenceManager.getDefaultSharedPreferences(gallery); 

    String key = groupbyPref.getString("GroupKey", "DAY"); 

    if (key.equals("DAY")) { 
     myScreenshotLibrary = ScreenshotLibrary.getInstance(gallery, 
       ScreenshotLibrary.GroupingMethod.DAY); 
     Bitmap[] item = myScreenshotLibrary.getGroup(1).getBitmaps(); 

    } 
    if (key.equals("WEEK")) { 
     myScreenshotLibrary = ScreenshotLibrary.getInstance(gallery, 
       ScreenshotLibrary.GroupingMethod.WEEK); 

    } 
    if (key.equals("MONTH")) { 
     myScreenshotLibrary = ScreenshotLibrary.getInstance(gallery, 
       ScreenshotLibrary.GroupingMethod.MONTH); 

    } 

} 

@Override 
public int getCount() { 
    return NoOfListItem; 

} 

@Override 
public Object getItem(int position) { 

    return null; 
} 

@Override 
public long getItemId(int position) { 
    // TODO Auto-generated method stub 
    return 0; 
} 

public void setnumcol(int i) { 
    grid.setNumColumns(i); 
    grid.requestLayout(); 
    notifyDataSetChanged(); 
} 

public int ListItemHeight(int length) { 
    SharedPreferences ImageSizePref = PreferenceManager 
      .getDefaultSharedPreferences(mContext); 
    Log.i("listsize", 
      "" + ((12/numcolumn) + 1) 
        * ImageSizePref.getInt("ImageParm", 100)); 
    Log.i("listsizen", "" + ((12/numcolumn) + 1)); 
    Log.i("listsizei", "" + 12 % 4); 
    if (length % numcolumn == 0) { 
     return ((length/numcolumn)) 
       * ImageSizePref.getInt("ImageParm", 100) + 55; 
    } else { 
     return ((length/numcolumn) + 1) 
       * ImageSizePref.getInt("ImageParm", 100) + 55; 
    } 

} 

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

    LayoutInflater inflater = ((Activity) mContext).getLayoutInflater(); 
    View customRow = inflater.inflate(R.layout.list_item, null); 

    grid = (GridView) customRow.findViewById(R.id.gridView1); 

    TextView txt = (TextView) customRow.findViewById(R.id.header); 
    txt.setText(header[position]); 
    Bitmap[] item = myScreenshotLibrary.getGroup(position).getBitmaps(); 
    grid.setAdapter(new gridadt(mContext, item)); 
    grid.setNumColumns(numcolumn); 

    grid.requestLayout(); 
    notifyDataSetChanged(); 
    grid.setVerticalScrollBarEnabled(false); 
    customRow 
      .setLayoutParams(new ListView.LayoutParams(
        ListView.LayoutParams.MATCH_PARENT, 
        ListItemHeight(item.length))); 
    Log.i("itemHeight", "" + customRow.getLayoutParams().height); 
    customRow.requestLayout(); 
    grid.setOnItemClickListener(this); 
    return customRow; 
} 

public class gridadt extends BaseAdapter { 

    Context mcontext; 

    LinearLayout.LayoutParams parms; 
    private int GroupCount; 
    ScreenshotLibrary myScreenshotLibrary = null; 
    private int count; 
    Bitmap[] images; 
    LayoutInflater inflater; 

    public gridadt(Context adapter, Bitmap[] item) { 
     // inflater = ((Activity) mcontext).getLayoutInflater(); 
     inflater = (LayoutInflater) adapter 
       .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     this.mcontext = adapter; 
     this.images = item; 
     this.count = item.length; 
     SharedPreferences ImageSizePref = PreferenceManager 
       .getDefaultSharedPreferences(adapter); 

     int size = ImageSizePref.getInt("ImageParm", 100); 
     parms = new LinearLayout.LayoutParams(size, size); 

    } 

    @Override 
    public int getCount() { 
     // TODO Auto-generated method stub 
     return count; 
    } 

    @Override 
    public Object getItem(int position) { 
     // TODO Auto-generated method stub 
     return null; 
    } 

    @Override 
    public long getItemId(int position) { 
     // TODO Auto-generated method stub 
     return 0; 
    } 

    public class ViewHolder { 

     public ImageView image; 

    } 

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

     View vi = convertView; 
     ViewHolder holder; 
     if (convertView == null) { 

      /****** Inflate grid_item.xml file for each row (Defined below) *******/ 

      vi = inflater.inflate(R.layout.grid_item, null); 
      /****** View Holder Object to contain tabitem.xml file elements ******/ 

      holder = new ViewHolder(); 

      holder.image = (ImageView) vi.findViewById(R.id.image); 

      /************ Set holder with LayoutInflater ************/ 
      vi.setTag(holder); 
     } else 
      holder = (ViewHolder) vi.getTag(); 

     ImageView image = holder.image; 

     // image.setImageBitmap(images[position]); 
     image.setImageResource(R.drawable.a); 
     image.setAdjustViewBounds(true); 
     image.setLayoutParams(parms); 
     return vi; 
    } 

} 

public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) { 

} 

}

這是獲取圖像,,,,,,,,,,

public class LibraryItem{ 
    public Bitmap getBitmap() throws FileNotFoundException{ 
     InputStream is = context.getResources().openRawResource(R.drawable.gallery_thumb_img1); 
     return BitmapFactory.decodeStream(is); 
    } 
} 
功能使用

回答

0

通過你的代碼來查看它的確切位置有點困難,但是你的問題肯定是你得到了太多圖片的引用,而沒有將它們提供給垃圾收集。然後,當Android設備不再有足夠的內存來支持所有的圖像時,你會得到一個OOM異常。

在您的庫適配器行127中,您調用「getBitmaps」,然後將其設置爲new grdadt。確保你在代碼中的某個時刻完全解除引用new grdadt(例如當它滾動出視圖時),並且它應該允許垃圾回收正常工作。

+0

你能幫我嗎。要做到這一點 – bhavdip

+0

你必須弄清楚如何自己做到這一點大部分,但我一定會提供幫助。但是,我不知道「grdadt」課程是什麼,這是難題的重要部分。 – CorayThan

+0

非常感謝您的幫助... gridadt類是適配器類,哪些是gridview和加載的圖像將用於gridadt ... – bhavdip

0
public View getView(int position, View convertView, ViewGroup parent) 

該塊似乎是你的問題對我來說,尤其是以下行:

Bitmap[] item = myScreenshotLibrary.getGroup(position).getBitmaps(); 

好像要保存每次調用該函數時所有的位圖,它被調用了很多如果我沒錯的話。