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);