Android OutofMemory映像适配器

Android OutofMemory映像适配器,android,performance,gridview,Android,Performance,Gridview,我正在尝试从sqldatabase获取图像(路径),并将图像放入gridview。 但我经常会收到一个OutOfMemoryError。 这是我的代码: public void dos(File myDir) { Cursor test; MyDB con = new MyDB(mContext); test = con.selectImages(); List<String> array = new ArrayList<String>(


我正在尝试从
sqldatabase
获取图像(路径),并将图像放入
gridview
。 但我经常会收到一个
OutOfMemoryError
。 这是我的代码:

public void dos(File myDir)
{
    Cursor test;
    MyDB con = new MyDB(mContext);
    test = con.selectImages();

    List<String> array = new ArrayList<String>();
    while(test.moveToNext()){
        String uname = test.getString(2);
        array.add(uname);
    }


    List<File> list = new ArrayList<File>();

    for (int i = 0; i < array.size(); i++) {
        list.add(new File(myDir + "/" + array.get(i)));
    }

    System.out.println(list);

    for (File file : list) {
        mThumbs.add(Drawable.createFromPath(file.getPath()));
    }
}

public View getView(int position, View convertView, ViewGroup parent) {
    ImageView imageView;
    if (convertView == null) {  // if it's not recycled, initialize some attributes
        imageView = new ImageView(mContext);
        imageView.setLayoutParams(new GridView.LayoutParams(230, 310));
        imageView.setScaleType(ImageView.ScaleType.CENTER_CROP);
        imageView.setPadding(0, 0, 0, 0);
    } else {
        imageView = (ImageView) convertView;
    }

    imageView.setImageDrawable(mThumbs.toArray(new Drawable[list.size()])[position]);
    return imageView;
}
我的问题是:我该怎么做才能让它在没有任何outofmemory错误的情况下正常工作呢。我的测试设备是谷歌的Nexus7

编辑: 谢谢你的回复,梅雷德里卡。这就解释了当每个图像都保存在内存中时的许多问题。
我的新问题是:我还能做什么呢?从数据库中拖出图像名称并将其放入gridview中?

您正在左右泄漏内存。你还保存着记忆中的每一个图像,这永远不会起作用。 我也很确定你会很快尝试加载一个太大的图像,这会再次杀死你的内存。您需要以正确的比例加载图像

Android只允许为每个应用程序使用一些固定的RAM集,然后它将拒绝为应用程序提供额外的RAM,从而导致OOMEException


从您的代码判断,您确实应该阅读一些,因为您在编程时就像在使用桌面java一样。这将导致一个错误的应用程序不断崩溃和无法修复的代码。我的意思不是冒犯,而是警告和建议。我以前见过很多次。

@ternes3-只需在清单中添加外部存储权限即可。xml@FarhaSameer786:谢谢您的回答,但问题仍然存在。@ternes3在添加外部存储权限后,只需将mainfest.xml的完整代码粘贴到日志文件中即可。谢谢您的回答。这就解释了当每个图像都保存在内存中时的许多问题。id还能做些什么呢?从数据库中读取图像名称并将其放入gridview?在
getView()
方法中加载项目,并确保从磁盘加载调整大小的项目。android官方文档用于此:。你也可以让你的生活不那么痛苦,使用毕加索:毕加索是完美的谢谢:D
ImageAdapter image = new ImageAdapter(this);
image.dos(filedir)

GridView gridview = (GridView) findViewById(R.id.gridview);
gridview.setAdapter(image);