OutOfMemoryError в setImageResource () на Зефир - PullRequest
0 голосов
/ 03 мая 2018

У меня есть ImageView, то есть 797x800 при загрузке и размещении в моем проекте. Тем не менее, он вписывается в ImageView на моей деятельности, который охватывает ширину экрана и примерно половину высоты. Я использую библиотеку GitHub с именем PhotoView ( com.github.chrisbanes.photoview.PhotoView ), чтобы изображение можно было увеличивать жестом, но сбой происходил даже до того, как я переключился на эту библиотеку. и просто использовал обычный ImageView.

После нажатия кнопки вызывается метод, который случайным образом генерирует строку в TextView, и после 50 вызовов с использованием обработчика (каждые 50 миллисекунд) он попадает в конечную строку и соответственно выбирает изображение. Когда вы снова нажимаете кнопку, он сбрасывает ImageView в исходное состояние и повторяет цикл. В операторе switch есть 30 изображений для выбора, и сбой происходит при setImageResource(R.drawable.image_name_here).

У меня вопрос: какие у меня есть варианты, чтобы правильно выделить достаточно памяти для старых телефонов, чтобы справиться с этим? Должен ли я просто изменить размер изображения перед размещением в моем проекте? Отчет о сбое не появляется в версиях Android> 6.0.

Мой след стека:

java.lang.OutOfMemoryError: 
  at dalvik.system.VMRuntime.newNonMovableArray (Native Method)
  at android.graphics.BitmapFactory.nativeDecodeAsset (Native Method)
  at android.graphics.BitmapFactory.decodeStream (BitmapFactory.java:856)
  at android.graphics.BitmapFactory.decodeResourceStream (BitmapFactory.java:675)
  at android.graphics.drawable.Drawable.createFromResourceStream (Drawable.java:2228)
  at android.content.res.Resources.loadDrawableForCookie (Resources.java:4215)
  at android.content.res.Resources.loadDrawable (Resources.java:4089)
  at android.content.res.Resources.getDrawable (Resources.java:2005)
  at android.content.res.Resources.getDrawable (Resources.java:1987)
  at android.content.Context.getDrawable (Context.java:464)
  at android.widget.ImageView.resolveUri (ImageView.java:827)
  at android.widget.ImageView.setImageResource (ImageView.java:434)
  at com.github.chrisbanes.photoview.PhotoView.setImageResource (PhotoView.java:111)
  at com.company_name.my_app_name.MainActivity.getMarker (MainActivity.java:355)
  at com.company_name.my_app_name.MainActivity.access$100 (MainActivity.java:37)
  at com.company_name.my_app_name.MainActivity$4$2.run (MainActivity.java:226)
  at android.os.Handler.handleCallback (Handler.java:739)
  at android.os.Handler.dispatchMessage (Handler.java:95)
  at android.os.Looper.loop (Looper.java:158)
  at android.app.ActivityThread.main (ActivityThread.java:7237)
  at java.lang.reflect.Method.invoke (Native Method)
  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run (ZygoteInit.java:1230)
  at com.android.internal.os.ZygoteInit.main (ZygoteInit.java:1120)

Метод getMarker (), в котором он происходит:

private void getMarker(String text) {
    switch (text) {
        case "Image 1":
            photoView.setImageResource(R.drawable.image_name1); 
            break;
        case "Image 2":
            photoView.setImageResource(R.drawable.image_name_2);
            break;
        case "Image 3":
            photoView.setImageResource(R.drawable.image_name_3);
            break;
        case "Image 4":
            photoView.setImageResource(R.drawable.image_name_4);
            break;
        case "Image 5":
            photoView.setImageResource(R.drawable.image_name_5);
            break;
//25 more switch cases follow

Я пробовал временное исправление с

android:largeHeap="true"

в моем Манифесте безрезультатно. Я не хотел, чтобы это было постоянным решением в любом случае.

Ответы [ 2 ]

0 голосов
/ 03 мая 2018

Вам нужно утилизировать старые растровые изображения. Сначала создайте растровое изображение из ресурса, а затем установите для этого растрового изображения imageView. После этого перезапустите старое растровое изображение.

    Bitmap newBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.image);
Bitmap oldBitmap = ((BitmapDrawable)imageView.getDrawable()).getBitmap();
imageView.setImageBitmap(newBitmap);
oldBitmap.recycle();
0 голосов
/ 03 мая 2018

Все эти изображения находятся в / res / drawable /

Переместите их в res/drawable-anydpi/. res/drawable/ является синонимом res/drawable-mdpi/. Большинство устройств Android имеют экраны с более высокой плотностью, и поэтому Android собирается немного повысить качество изображения, в результате чего они занимают немного больше памяти.

...