2017-11-15 4 views
0

Ich verwende 2 Bilder für den Splash-Screen meiner App. Das Logo in meinem ImageView (src) und der Hintergrund im Layout (: Hintergrund) und obwohl meine App auf dem Emulator gut funktioniert, stürzt es auf meinem Handy ab (S8). Unten sehen Sie meine XML-Datei, die für meinen SplashScreen und die Ausnahme verantwortlich ist. Von dem, was ich verstehe, wird eines dieser Bilder (oder beide?) Als zu groß für den Speicher meines Telefons angesehen? Ihre Dimension ist jedoch: logo (1305x641) Hintergrund (1688x1125).App funktioniert auf Emulator, stürzt aber auf S8

Irgendwelche Ideen, wie Sie das beheben können? Ich dachte daran, verschiedene Auflösungsversionen der Bilder zur Verfügung zu stellen, aber ich verliere mich dabei.

<?xml version="1.0" encoding="utf-8"?> 
<android.support.constraint.ConstraintLayout xmlns:app="http://schemas.android.com/apk/res-auto" 
    xmlns:tools="http://schemas.android.com/tools" 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:background="@drawable/background" 
    android:gravity="center_horizontal|center_vertical" 
    tools:context="com.spdesigns.funfacts.SplashScreen"> 


<ImageView 
    android:id="@+id/logoImageView" 
    android:layout_width="377dp" 
    android:layout_height="293dp" 
    android:layout_marginBottom="8dp" 
    android:layout_marginEnd="8dp" 
    android:layout_marginStart="8dp" 
    android:layout_marginTop="8dp" 
    android:src="@drawable/logo" 
    app:layout_constraintBottom_toBottomOf="parent" 
    app:layout_constraintEnd_toEndOf="parent" 
    app:layout_constraintStart_toStartOf="parent" 
    app:layout_constraintTop_toTopOf="parent" /> 
</android.support.constraint.ConstraintLayout> 

Ausnahme:

11-16 00:11:01.529 3688-3688/com.spdesigns.funfacts E/AndroidRuntime: FATAL EXCEPTION: main 
                    Process: com.spdesigns.funfacts, PID: 3688 
                    java.lang.RuntimeException: Canvas: trying to draw too large(120362760bytes) bitmap. 
                     at android.view.DisplayListCanvas.throwIfCannotDraw(DisplayListCanvas.java:260) 
                     at android.graphics.Canvas.drawBitmap(Canvas.java:1420) 
                     at android.graphics.drawable.BitmapDrawable.draw(BitmapDrawable.java:545) 
                     at android.widget.ImageView.onDraw(ImageView.java:1286) 
                     at android.view.View.draw(View.java:18394) 
                     at android.view.View.updateDisplayListIfDirty(View.java:17372) 
                     at android.view.View.draw(View.java:18156) 
                     at android.view.ViewGroup.drawChild(ViewGroup.java:3969) 
                     at android.view.ViewGroup.dispatchDraw(ViewGroup.java:3755) 
                     at android.view.View.draw(View.java:18397) 
                     at android.view.View.updateDisplayListIfDirty(View.java:17372) 
                     at android.view.View.draw(View.java:18156) 
                     at android.view.ViewGroup.drawChild(ViewGroup.java:3969) 
                     at android.view.ViewGroup.dispatchDraw(ViewGroup.java:3755) 
                     at android.view.View.updateDisplayListIfDirty(View.java:17367) 
                     at android.view.View.draw(View.java:18156) 
                     at android.view.ViewGroup.drawChild(ViewGroup.java:3969) 
                     at android.view.ViewGroup.dispatchDraw(ViewGroup.java:3755) 
                     at android.view.View.updateDisplayListIfDirty(View.java:17367) 
                     at android.view.View.draw(View.java:18156) 
                     at android.view.ViewGroup.drawChild(ViewGroup.java:3969) 
                     at android.view.ViewGroup.dispatchDraw(ViewGroup.java:3755) 
                     at android.view.View.updateDisplayListIfDirty(View.java:17367) 
                     at android.view.View.draw(View.java:18156) 
                     at android.view.ViewGroup.drawChild(ViewGroup.java:3969) 
                     at android.view.ViewGroup.dispatchDraw(ViewGroup.java:3755) 
                     at android.view.View.updateDisplayListIfDirty(View.java:17367) 
                     at android.view.View.draw(View.java:18156) 
                     at android.view.ViewGroup.drawChild(ViewGroup.java:3969) 
                     at android.view.ViewGroup.dispatchDraw(ViewGroup.java:3755) 
                     at android.view.View.draw(View.java:18397) 
                     at com.android.internal.policy.DecorView.draw(DecorView.java:967) 
                     at android.view.View.updateDisplayListIfDirty(View.java:17372) 
                     at android.view.ThreadedRenderer.updateViewTreeDisplayList(ThreadedRenderer.java:722) 
                     at android.view.ThreadedRenderer.updateRootDisplayList(ThreadedRenderer.java:728) 
                     at android.view.ThreadedRenderer.draw(ThreadedRenderer.java:836) 
                     at android.view.ViewRootImpl.draw(ViewRootImpl.java:3181) 
                     at android.view.ViewRootImpl.performDraw(ViewRootImpl.java:2977) 
                     at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:2565) 
                     at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1550) 
                     at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:7189) 
                     at android.view.Choreographer$CallbackRecord.run(Choreographer.java:959) 
                     at android.view.Choreographer.doCallbacks(Choreographer.java:734) 
                     at android.view.Choreographer.doFrame(Choreographer.java:670) 
                     at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:945) 
                     at android.os.Handler.handleCallback(Handler.java:751) 
                     at android.os.Handler.dispatchMessage(Handler.java:95) 
                     at android.os.Looper.loop(Looper.java:154) 
                     at android.app.ActivityThread.main(ActivityThread.java:6776) 
                     at java.lang.reflect.Method.invoke(Native Method) 
                     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1520) 
                     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1410) 

Antwort

2

Sie versuchen, ein 120 MB Bild in den Speicher zu laden. Das ist etwa 20 mal größer als jedes Bild, das jemals geladen werden sollte.

Es funktioniert gut auf Emulatoren, wie sie den Speicher Ihres Computers verwenden können, und haben möglicherweise lockere Regeln für Speicherverbrauch. Aber reale Geräte sind viel strenger.

Sie sollten folgendes tun: das Bild weiter
2) Run pngcrush auf alle Bilder in der App nach unten
1) Skala. Es ist ein Programm, das Speichergröße von Bildern reduziert, ohne die Qualität zu verlieren (lesen Sie ihre Dokumentation für spezifische)
3) Stellen Sie unterschiedliche Größe Bilder für hdpi, xhdpi, xxhdpi und xxxhdpi Dichten. Auf diese Weise lädt das System das entsprechende Bild entsprechend der Bildschirmgröße.

+0

Es ist ziemlich beunruhigend, dass es auf einem Emulator funktionierte, irgendwie gegen seinen Zweck geht! Auch das wäre ein höllischer Download für einen Splash-Screen! –

+0

@Moonbloom Ich komprimierte beide auf 30 ~ 40KB, aber ich bekomme den gleichen Fehler, dass ich versuche, eine 121500000Byte Bitmap zu zeichnen. Wie ist das möglich, seit ich sie komprimiert habe? –

+0

Dann sind es nicht diese Bilder, die den Fehler verursachen. Kannst du versuchen, die Bilder buchstäblich zu entfernen und sie nicht als Hintergrund/Logo zu setzen, dann die App laufen lassen und sehen, was passiert? – Moonbloom

0

Ich habe das Problem behoben.

Wenn Sie das gleiche Problem haben, verschieben Sie einfach Ihre Bitmap in den Ordner Mipmap-xxxhdpi. Da das Bild zu groß ist und ich es innerhalb des Drawables-Verzeichnisses platziert habe, betrachtet Android dies als ein mdpi-Bild. Dies führt dazu, dass Android es noch mehr skaliert und somit die App stürzt und die OutOfMemory Exception auslöst. Indem er es in den mipmap-xxxhdpi-Ordner legt, skaliert Android es einfach auf das Ziel res.

Verwandte Themen