2015-04-17 14 views
5

Chcę zaimplementować stronę powitalną w mojej aplikacji na Androida. Tak więc w układzie xml istnieje imageView, a plik obrazu jest plikiem png, który jest 1080*1920, kiedy uruchamiamy aplikację, pojawia się błąd OutOfMemoryError, jak mogę to naprawić?OutOfMemoryError: Używanie obrazu 1080 * 1920 do strony powitalnej

Plik 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> 

informacji o błędzie:

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

Dlatego lepiej użyć ** kaflowej ** bitmapy (znacznie mniejszej) z nałożonym tekstem. –

+0

W jakim folderze umieszczasz welcome1.png? –

+2

Użyj obrazu o niskiej rozdzielczości lub programowo go dekoduj przy użyciu opcji 'BitmapFactory.Options'. – Piyush

Odpowiedz

7

Jeśli masz welcome1.png w folderze drawable umieść go w urządzeniu drawable-nodpi.

Jest to spowodowane tym, żejest interpretowany jako drawable-mdpi, więc po załadowaniu go na telefon o wyższej gęstości, zostanie przeskalowany (stanie się gigantyczną bitmapą).

+0

Ta metoda działa! Dzięki :) Korzystam ze studia Android, istnieją cztery foldery: mipmap-hdpi, mipmap-mdpi, mipmap-xhdpi, mipmap-xxhdpi, jaka rozdzielczość obrazu może obsługiwać – user2655973

+0

Są one używane dla nowej domyślnej ikony programu uruchamiającego . Nie wiem, jak one działają, ale możesz utworzyć nowy folder drawable-nodpi i umieścić tam welcome1.png. –

1

pamięć przydzielona na App jest rzadki w Androidzie nie należy dawać go do obrazów tak po prostu.

aplikacja ma za mało pamięci, z powodu której pojawia się ten błąd.

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

dobrze, że nie jest to dokładne rozwiązanie, spróbuj minimalizując rozdzielczości obrazu i można pozbyć się tego błędu,

1

Android w ogóle ma problemy z obrazami, zwłaszcza dużych. Wynika to z maksymalnej kwoty, jaką aplikacja może przydzielić. . Można resample bitmap jak załadować je w

jako krótki przykład, będzie to zmniejszyć rozmiar obrazu o połowę:

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

spróbuj przeskalować w dół oryginalny obraz (zachowując proporcje) i niż ustawić scaleType w swojej ImageView ro fitCenter lub centerCrop:

<ImageView 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:scaleType="fitCenter" 
    android:background="@drawable/welcome1"/> 
Powiązane problemy