簡體   English   中英

加載圖片時出現java.lang.OutOfMemoryError

[英]java.lang.OutOfMemoryError when loading image

當我嘗試從SD卡滾動查找更多圖像時,它顯示java.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);
    }
}

遍歷代碼並准確查看其發生位置有些困難,但是您的問題肯定是您獲得了對太多圖像的引用,而沒有將其中任何圖像用於垃圾回收。 然后,當android設備不再具有足夠的內存來支持所有圖像時,您將收到OOM異常。

在“庫”適配器行127中,調用“ getBitmaps”,然后在new grdadt 確保在代碼的某個位置完全取消引用了new grdadt (例如,當它滾動到視圖外時),並且應該允許垃圾回收正常工作。

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

對我來說,這個障礙似乎是您的問題,尤其是以下幾行:

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

似乎您每次調用該函數時都在保存所有位圖,如果我沒記錯的話,它會被調用很多。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM