У меня есть 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"
в моем Манифесте безрезультатно. Я не хотел, чтобы это было постоянным решением в любом случае.