我正在尝试将几张照片从我的Android应用程序上传到服务器。我收到内存不足错误。我的图像选择代码如下
单击选择图像按钮时触发的代码
public void triggerImageSelection(View view) {
int triggeringView = Integer.parseInt((String) view.getTag());
Log.v(DBUG, "tag of the view:" + triggeringView);
Intent intent = new Intent();
intent.setType("image/*");
intent.setAction(Intent.ACTION_GET_CONTENT);
startActivityForResult(Intent.createChooser(intent, "Select Picture"),
triggeringView);
}
onActivityResult部分代码如下:
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
// TODO Auto-generated method stub
super.onActivityResult(requestCode, resultCode, data);
Log.v(DBUG, "request code:: " + requestCode);
switch (requestCode) {
case 0:
if (resultCode == RESULT_OK) {
filePaths[0] = getPath(data.getData());
File filewe = new File(getPath(data.getData()));
Bitmap bitmap1 = BitmapFactory.decodeFile(getPath(data
.getData()));
mAdImage1.setImageBitmap(bitmap1);
if (filewe != null)
Log.v(DBUG, "got file" + filePaths[0]);
mAdImage1.setVisibility(View.VISIBLE);
}
break;
getPath(); function返回文件路径,如下所示
private String getPath(Uri uri) {
String[] projection = { MediaStore.Images.Media.DATA };
Cursor cursor = getContentResolver().query(uri, projection, null, null,
null);
int column_index = cursor
.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
cursor.moveToFirst();
String filePath = cursor.getString(column_index);
cursor.close();
return filePath;
}
我有四个按钮用于选择四个图像。它第一次正常工作,但第二次显示内存不足异常。我该如何解决这个问题?
答案 0 :(得分:3)
从文件中读取时尝试降低图像质量,如下所示
BitmapFactory.Options options = new BitmapFactory.Options();
options.inSampleSize = 6;
Bitmap bitmap1 = BitmapFactory.decodeFile(getPath(data.getData()),options);
mAdImage1.setImageBitmap(bitmap1);
bitmap1.recycle();
bitmap1=null;
如果问题仍然存在,请在清单文件的应用程序标记中使用android:largeHeap="true"
。
答案 1 :(得分:0)
这里的问题是每次创建新的Bitmap时,旧的Bitmaps仍然存在于内存中。 GC会在决定时收集它。
如果是Bitmaps,建议通知GC垃圾收集对象。我建议采用以下方法。希望这有助于!
每当活动被销毁时,请回收位图,如下所示。需要从onDestroy活动方法调用此方法。 destroy意味着我们现在不需要位图。 参考:http://developer.android.com/reference/android/graphics/Bitmap.html#recycle()
public void recycleBitmap(Bitmap bitmap) {
if (bitmap != null) {
bitmap.recycle();
bitmap = null;
System.gc();
}
}