2015-04-17 6 views
5

Voglio implementare una pagina iniziale nella mia app Android. Quindi nel layout xml, c'è un imageView e il file immagine è un file png che è 1080*1920, quando si esegue l'app, si verifica un errore OutOfMemoryError, come posso risolvere il problema?OutOfMemoryError: utilizzando un'immagine che è 1080 * 1920 fare la splash page

Il file XML:

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:orientation="vertical" android:layout_width="match_parent" 
    android:layout_height="match_parent"> 

    <ImageView 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:background="@drawable/welcome1"/> 

</LinearLayout> 

Le informazioni di errore:

04-17 18:40:16.038 29793-29793/cn.test.android E/AndroidRuntime﹕ FATAL EXCEPTION: main 
Process: cn.test.android, PID: 29793 
java.lang.OutOfMemoryError 
     at android.graphics.BitmapFactory.nativeDecodeAsset(Native Method) 
     at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:597) 
     at android.graphics.BitmapFactory.decodeResourceStream(BitmapFactory.java:432) 
     at android.graphics.drawable.Drawable.createFromResourceStream(Drawable.java:840) 
     at android.content.res.Resources.createFromResourceStream(Resources.java:2477) 
     at android.content.res.Resources.loadDrawable(Resources.java:2136) 
     at android.content.res.MiuiResources.loadDrawable(MiuiResources.java:320) 
     at android.content.res.Resources.getDrawable(Resources.java:710) 
     at android.widget.ImageView.resolveUri(ImageView.java:638) 
     at android.widget.ImageView.setImageResource(ImageView.java:367) 
     at cn.test.android.LandingPageActivity$1.instantiateItem(LandingPageActivity.java:40) 
     at android.support.v4.view.ViewPager.addNewItem(ViewPager.java:837) 
     at android.support.v4.view.ViewPager.populate(ViewPager.java:987) 
     at android.support.v4.view.ViewPager.populate(ViewPager.java:919) 
     at android.support.v4.view.ViewPager.onMeasure(ViewPager.java:1441) 
     at android.view.View.measure(View.java:16508) 
     at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5125) 
     at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1404) 
     at android.widget.LinearLayout.measureVertical(LinearLayout.java:695) 
     at android.widget.LinearLayout.onMeasure(LinearLayout.java:588) 
     at android.view.View.measure(View.java:16508) 
     at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5125) 
     at android.widget.FrameLayout.onMeasure(FrameLayout.java:310) 
     at android.view.View.measure(View.java:16508) 
     at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5125) 
     at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1404) 
     at android.widget.LinearLayout.measureVertical(LinearLayout.java:695) 
     at android.widget.LinearLayout.onMeasure(LinearLayout.java:588) 
     at android.view.View.measure(View.java:16508) 
     at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5125) 
     at android.widget.FrameLayout.onMeasure(FrameLayout.java:310) 
     at com.android.internal.policy.impl.PhoneWindow$DecorView.onMeasure(PhoneWindow.java:2291) 
     at android.view.View.measure(View.java:16508) 
     at android.view.ViewRootImpl.performMeasure(ViewRootImpl.java:1946) 
     at android.view.ViewRootImpl.measureHierarchy(ViewRootImpl.java:1143) 
     at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1325) 
     at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1030) 
     at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:5639) 
     at android.view.Choreographer$CallbackRecord.run(Choreographer.java:761) 
     at android.view.Choreographer.doCallbacks(Choreographer.java:574) 
     at android.view.Choreographer.doFrame(Choreographer.java:544) 
     at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:747) 
     at android.os.Handler.handleCallback(Handler.java:733) 
     at android.os.Handler.dispatchMessage(Handler.java:95) 
     at android.os.Looper.loop(Looper.java:136) 
     at android.app.ActivityThread.main(ActivityThread.java:5047) 
     at java.lang.reflect.Method.invokeNative(Native Method) 
     at java.lang.reflect.Method.invoke(Method.java:515) 
     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:806) 
     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:622) 
     at dalvik.system.NativeStart.main(Native Method) 
+1

Ecco perché è meglio usare un ** bitmap piastrellato ** (molto più piccolo) con testo sovraimpresso. –

+0

In quale cartella metti welcome1.png? –

+2

Usa l'immagine a bassa risoluzione o decodificalo a livello di codice usando 'BitmapFactory.Options'. – Piyush

risposta

7

Se hai welcome1.png nella cartella drawable, inserirla nello drawable-nodpi.

Questo perché drawable viene interpretato come drawable-mdpi, quindi quando lo si carica su un telefono a densità più alta verrà eseguito l'upscaling (diventando una gigantesca bitmap).

+0

Questo metodo funziona! Grazie :) Sto usando lo studio Android, ci sono quattro cartelle: mipmap-hdpi, mipmap-mdpi, mipmap-xhdpi, mipmap-xxhdpi, quale risoluzione dell'immagine possono supportare – user2655973

+0

Quelli sono usati per la nuova icona di avvio predefinita . Non so come funzionano, ma puoi creare una nuova cartella Drawable-nodpi e mettere welcome1.png lì. –

1

memoria allocata per ogni App è sparsa in Android non dovrebbe essere darlo a immagini così.

l'applicazione sta esaurendo la memoria a causa della quale si sta verificando questo errore.

what you can do is increase cahce memory of emulator to support your memory usage. 

bene che non è la soluzione esatta, provare a ridurre la risoluzione delle immagini e si può sbarazzarsi di questo errore,

1

Android in generale ha problemi con le immagini, soprattutto quelle più grandi. Ciò è dovuto all'ammontare massimo che un'app può assegnare. . È possibile ricampionare bitmap come li si carica in

Come un breve esempio, questo ridurrà la dimensione dell'immagine della metà:

final BitmapFactory.Options opts = new BitmapFactory.Options(); 
opts.inSampleSize = 2; 
Bitmap bm = BitmapFactory.decodeStream(is, null, opts); 
1

Provare a ridimensionare l'immagine originale (mantenendo le proporzioni) e di impostare il scaleType nel vostro ImageView ro fitCenter o centerCrop:

<ImageView 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:scaleType="fitCenter" 
    android:background="@drawable/welcome1"/> 
Problemi correlati