gpt4 book ai didi

连续两次获取相同图像后的android位图内存不足错误

转载 作者:行者123 更新时间:2023-11-29 21:44:33 28 4
gpt4 key购买 nike

我有一个程序应该从用户的图库中抓取图像,然后在后续 Activity 中显示该图像。作为测试的一部分,我尝试连续执行两次操作:在 ViewImageActivity 中,我单击将我带到画廊的按钮;选择图像;然后在 FriendsActivity 中查看图像。然后我单击后退按钮并重复该过程。第二次我总是得到一个 ava.lang.OutOfMemoryError。我包括错误日志:

04-26 09:43:57.911: W/dalvikvm(30841): threadid=1: thread exiting with uncaught exception (group=0x40c231f8)
04-26 09:43:57.918: E/AndroidRuntime(30841): FATAL EXCEPTION: main
04-26 09:43:57.918: E/AndroidRuntime(30841): java.lang.OutOfMemoryError
04-26 09:43:57.918: E/AndroidRuntime(30841): at android.graphics.BitmapFactory.nativeDecodeStream(Native Method)
04-26 09:43:57.918: E/AndroidRuntime(30841): at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:493)
04-26 09:43:57.918: E/AndroidRuntime(30841): at android.graphics.BitmapFactory.decodeFile(BitmapFactory.java:299)
04-26 09:43:57.918: E/AndroidRuntime(30841): at android.graphics.BitmapFactory.decodeFile(BitmapFactory.java:324)
04-26 09:43:57.918: E/AndroidRuntime(30841): at com.example.game.utils.FileUtils.imageFromGallery(FileUtils.java:87)
04-26 09:43:57.918: E/AndroidRuntime(30841): at com.example.game.utils.FileUtils.unmarshallBitmap(FileUtils.java:71)
04-26 09:43:57.918: E/AndroidRuntime(30841): at com.example.game.FriendsActivity.onCreate(FriendsActivity.java:46)
04-26 09:43:57.918: E/AndroidRuntime(30841): at android.app.Activity.performCreate(Activity.java:4638)
04-26 09:43:57.918: E/AndroidRuntime(30841): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1051)
04-26 09:43:57.918: E/AndroidRuntime(30841): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1940)
04-26 09:43:57.918: E/AndroidRuntime(30841): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2001)
04-26 09:43:57.918: E/AndroidRuntime(30841): at android.app.ActivityThread.access$600(ActivityThread.java:129)
04-26 09:43:57.918: E/AndroidRuntime(30841): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1153)
04-26 09:43:57.918: E/AndroidRuntime(30841): at android.os.Handler.dispatchMessage(Handler.java:99)
04-26 09:43:57.918: E/AndroidRuntime(30841): at android.os.Looper.loop(Looper.java:137)
04-26 09:43:57.918: E/AndroidRuntime(30841): at android.app.ActivityThread.main(ActivityThread.java:4516)
04-26 09:43:57.918: E/AndroidRuntime(30841): at java.lang.reflect.Method.invokeNative(Native Method)
04-26 09:43:57.918: E/AndroidRuntime(30841): at java.lang.reflect.Method.invoke(Method.java:511)
04-26 09:43:57.918: E/AndroidRuntime(30841): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:791)
04-26 09:43:57.918: E/AndroidRuntime(30841): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:558)
04-26 09:43:57.918: E/AndroidRuntime(30841): at dalvik.system.NativeStart.main(Native Method)
04-26 09:44:00.997: I/Process(30841): Sending signal. PID: 30841 SIG: 9

我的程序是这样写的:

ViewImageActivity 调度 Intent 从图片库中获取照片;然后 onActivityResult 调用 FriendsActivity。 FriendsActivity 又调用FileUtils 的静态方法unmarshallBitmap 获取图片进行显示。请参阅以下 fragment :

ViewImageActivity:

public void dispatchGalleryIntent(View view) {
Intent gallery = new Intent(Intent.ACTION_PICK, android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
startActivityForResult(gallery, LOAD_IMAGE_REQUEST_CODE);
}

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {

super.onActivityResult(requestCode, resultCode, data);
if (resultCode == RESULT_OK) {
if (requestCode == LOAD_IMAGE_REQUEST_CODE) {
imageUri = data.getData();
}
dispatchIntentToFriendsActivity();
}
}

private void dispatchIntentTo FriendsActivity() {
Intent intent = new Intent(this, FriendsActivity.class);
intent.putExtra(IMAGE_URI, imageUri);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);
}

好友 Activity

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_friends);
Uri imageUri = (Uri) getIntent().getExtras().get(IMAGE_URI);
myImage = FileUtils.unmarshallBitmap(imageUri, getContentResolver());

...
}

文件工具

public static Bitmap unmarshallBitmap(Uri imageUri, ContentResolver resolver) {
return imageFromGallery(imageUri, resolver);
}

private static Bitmap imageFromGallery(Uri imageUri, ContentResolver resolver) {
try {
String[] filePathColumn = { MediaStore.Images.Media.DATA };
Cursor cursor = resolver.query(imageUri, filePathColumn, null, null, null);
cursor.moveToFirst();
int columnIndex = cursor.getColumnIndex(filePathColumn[0]);
String picturePath = cursor.getString(columnIndex);
cursor.close();
return BitmapFactory.decodeFile(picturePath);
} catch (Exception x) {
return null;
}
}

顺便说一句:我已经看到了How to solve the Out of Memory issue while displaying image in android? .我的图像第一次加载正常。问题是,如果用户改变主意并决定选择不同的图像(后退按钮并重复),则应用会崩溃,如上所述。

最佳答案

当用户按下后退按钮并转到不同的图像时,回收当前加载的位图图像

myImage.recycle();

关于连续两次获取相同图像后的android位图内存不足错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16241915/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com