2015-04-17 3 views
5

मैं अपने एंड्रॉइड ऐप में एक स्पलैश पेज को कार्यान्वित करना चाहता हूं। तो लेआउट xml में, एक छवि दृश्य है और छवि फ़ाइल एक पीएनजी फ़ाइल है जो 1080*1920 है, जब कोई ऐप चलाता है, तो यह OutOfMemoryError त्रुटि होती है, मैं इसे कैसे ठीक कर सकता हूं?OutOfMemoryError: एक छवि का उपयोग करना जो 1080 * 1920 है स्पलैश पेज

एक्सएमएल फ़ाइल:

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

त्रुटि जानकारी:

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

यही कारण है कि आप ** टेक्स्ट टाइल किए गए ** बिटमैप (बहुत छोटे) का बेहतर उपयोग करते हैं, कुछ पाठ ओवरलेड के साथ। –

+0

आप किस फ़ोल्डर में welcome1.png डालते हैं? –

+2

'बिटमैप फैक्टरी.ऑप्शन' का उपयोग करके कम रिज़ॉल्यूशन छवि का उपयोग करें या प्रोग्रामेटिक रूप से इसे डीकोड करें। – Piyush

उत्तर

7

आप welcome1.png है drawable फ़ोल्डर में, इसे drawable-nodpi पर रखें।

ऐसा इसलिए है क्योंकि drawable को drawable-mdpi के रूप में व्याख्या किया गया है, इसलिए जब आप इसे उच्च घनत्व वाले फ़ोन पर लोड करते हैं तो इसे अपरिवर्तित किया जाएगा (एक विशाल बिटमैप बनना)।

+0

यह विधि काम करता है! धन्यवाद :) मैं एंड्रॉइड स्टूडियो का उपयोग कर रहा हूं, चार फ़ोल्डर हैं: mipmap-hdpi, mipmap-mdpi, mipmap-xhdpi, mipmap-xxhdpi, छवि का कौन सा संकल्प – user2655973

+0

का समर्थन कर सकता है जो नए डिफ़ॉल्ट लॉन्चर आइकन के लिए उपयोग किए जाते हैं । मुझे नहीं पता कि वे कैसे काम करते हैं, लेकिन आप एक नया ड्रॉबल-नोडपी फ़ोल्डर बना सकते हैं और वहां welcome1.png डाल सकते हैं। –

1

स्मृति में प्रति एप्लिकेशन को Android आप इसे ऐसे ही छवियों के लिए नहीं दे रही किया जाना चाहिए में विरल है आवंटित।

आपका एप्लिकेशन स्मृति पर कम चल रहा है जिसके कारण आपको यह त्रुटि मिल रही है।

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

अच्छी तरह से कि सटीक समाधान नहीं है, छवि संकल्प को कम करने का प्रयास करें और आपको यह त्रुटि से छुटकारा पा सकते,

1

सामान्य रूप में एंड्रॉयड छवियों, खासकर बड़े लोगों के साथ समस्या है। यह किसी ऐप को आवंटित करने की अधिकतम राशि के कारण है। । अपनी मूल छवि नीचे पैमाने पर करने के (पहलू अनुपात रखने)

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

प्रयास करें: आप बिटमैप्स resample कर सकते हैं में उन्हें लोड के रूप में

एक छोटी उदाहरण के रूप में, यह आधे से छवि का आकार कम हो जाएगा और अपनी ImageViewro fitCenter या centerCropscaleType सेट की तुलना में:

<ImageView 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:scaleType="fitCenter" 
    android:background="@drawable/welcome1"/> 
संबंधित मुद्दे