OutofMemoryException при реализации сенсорного события в Android? - PullRequest
0 голосов
/ 13 июня 2011

Я внедряю SensorEventListner в свою деятельность. У меня есть три действия, которые SensorEventListner выполняет, чтобы обнаружить дрожание. Во всех трех видах деятельности я регистрирую sensorListner onCreate и отменяю регистрацию listner onPause. При вызове каждого действия оно регистрируется снова, а затем `отменяет регистрацию в OnPause.

Мое приложение выделило размер кучи как 3,6 МБ, в то время как размер кучи устройства составляет 16 МБ, но при этом принудительно закрывается с ошибкой в ​​LogCat как:

«OutOfMemoryException: размер растрового изображения превышает бюджет виртуальной машины» РЕДАКТИРОВАТЬ: Logcat ошибка

06-13 15:47:35.056: ERROR/AndroidRuntime(10377): Uncaught handler: thread main exiting due to uncaught exception
06-13 15:47:35.196: ERROR/AndroidRuntime(10377): java.lang.OutOfMemoryError: bitmap size exceeds VM budget
06-13 15:47:35.196: ERROR/AndroidRuntime(10377):     at android.graphics.BitmapFactory.nativeDecodeAsset(Native Method)
06-13 15:47:35.196: ERROR/AndroidRuntime(10377):     at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:464)
06-13 15:47:35.196: ERROR/AndroidRuntime(10377):     at android.graphics.BitmapFactory.decodeResourceStream(BitmapFactory.java:340)
06-13 15:47:35.196: ERROR/AndroidRuntime(10377):     at android.graphics.drawable.Drawable.createFromResourceStream(Drawable.java:697)
06-13 15:47:35.196: ERROR/AndroidRuntime(10377):     at android.content.res.Resources.loadDrawable(Resources.java:1705)
06-13 15:47:35.196: ERROR/AndroidRuntime(10377):     at android.content.res.Resources.getDrawable(Resources.java:580)
06-13 15:47:35.196: ERROR/AndroidRuntime(10377):     at android.widget.ImageView.resolveUri(ImageView.java:548)
06-13 15:47:35.196: ERROR/AndroidRuntime(10377):     at android.widget.ImageView.setImageResource(ImageView.java:270)
06-13 15:47:35.196: ERROR/AndroidRuntime(10377):     at com.nga.flashcards.activities.GardenActivity.display(GardenActivity.java:1024)
06-13 15:47:35.196: ERROR/AndroidRuntime(10377):     at com.nga.flashcards.activities.GardenActivity.onSensorChanged(GardenActivity.java:1352)
06-13 15:47:35.196: ERROR/AndroidRuntime(10377):     at android.hardware.SensorManager$ListenerDelegate$1.handleMessage(SensorManager.java:435)
06-13 15:47:35.196: ERROR/AndroidRuntime(10377):     at android.os.Handler.dispatchMessage(Handler.java:99)
06-13 15:47:35.196: ERROR/AndroidRuntime(10377):     at android.os.Looper.loop(Looper.java:123)
06-13 15:47:35.196: ERROR/AndroidRuntime(10377):     at android.app.ActivityThread.main(ActivityThread.java:4595)
06-13 15:47:35.196: ERROR/AndroidRuntime(10377):     at java.lang.reflect.Method.invokeNative(Native Method)
06-13 15:47:35.196: ERROR/AndroidRuntime(10377):     at java.lang.reflect.Method.invoke(Method.java:521)
06-13 15:47:35.196: ERROR/AndroidRuntime(10377):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:860)
06-13 15:47:35.196: ERROR/AndroidRuntime(10377):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618)
06-13 15:47:35.196: ERROR/AndroidRuntime(10377):     at dalvik.system.NativeStart.main(Native Method)

У меня также есть большое количество изображений и их изменение в просмотре изображений с помощью setImageResource (). Получение ошибки при использовании SensorEventListner. Если событие датчика не используется в приложении, то работает нормально.

Мои вопросы:

  • Есть ли какие-либо проблемы с памятью при повторной регистрации и отмене регистрации слушателя в приложении?

  • Есть ли утечки памяти, если да, то как их обнаружить и как можно решить проблему?

Ответы [ 3 ]

1 голос
/ 13 июня 2011

Ваша проблема в вашем методе GardenActivity.display (), где вы вызываете setImageResource.Это то, что вызывает вашу проблему.Возможно, проверьте размер изображения, которое вы используете, и уменьшите его.

Чтобы доказать, что это правильно, закомментируйте вызов display () из вашего метода onSensorChanged (), инайти, что это будет работать.Таким образом, доказывая, что проблема заключается не в платформе датчиков, а в том, что вы делаете в обработчике событий, что и вызывает проблему (как я упоминал в моих предыдущих комментариях).

1 голос
/ 13 июня 2011

Ошибка связана с битмапами, а не с сенсором.

  1. см. OutOfMemoryError: размер растрового изображения превышает бюджет виртуальной машины: - Android
  2. убедитесь, что вы вызываете Bitmap.recycle ()
  3. проверить размер загружаемого растрового изображения
0 голосов
/ 13 июня 2011

Я бы сказал, что вы пытаетесь загрузить изображение в вашем ImageView, которое слишком велико для декодирования в памяти.Попытайтесь выяснить, какое рисование вызывает ошибку, когда вы получаете исключение (используйте точку останова в коде обработки исключений, например:

resourceId = ...; (here you put the resource ID)
try {
  imageView.setImageResource(resourceId);
} catch (Exception e) {  // to be removed in production code
  Log.d("", "Failed to load resource: " + resourceId);
}

Я не думаю, что это имеет какое-либо отношение к слушателю датчика.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...