Android: java.lang.OutOfMemoryError: ไม่สามารถจัดสรรการจัดสรรไบต์ 23970828 ด้วย 2097152 ไบต์ว่างและ 2MB จนถึง OOM


355

ฉันต้องการที่จะแสดงภาพบิตแมปในImageViewจากการ์ด sd ซึ่งเก็บไว้แล้ว หลังจากเรียกใช้แอปพลิเคชันของฉันมีปัญหาและได้รับข้อผิดพลาดOutOfMemoryErrorของ:

(java.lang.OutOfMemoryError: ไม่สามารถจัดสรรการจัดสรรไบต์ 23970828 ด้วย 2097152 ไบต์ว่างและ 2MB จนถึง OOM)

ฉันไม่มีความคิดหรือเพราะความจำไม่พอ ฉันคิดว่าขนาดภาพของฉันใหญ่มากฉันจึงลองเปลี่ยนมัน

Iterator<String> it = imageArray.iterator();
while (it.hasNext()) {
  Object element = it.next();
  String objElement = element.toString();
  Log.e("objElement ", " = " + objElement);
  final ImageView imageView = new ImageView (getContext());
  final ProgressBar pBar = new ProgressBar(getContext(), null, 
                                           android.R.attr.progressBarStyleSmall);
  imageView.setTag(it);
  pBar.setTag(it);

  imageView.setImageResource(R.drawable.img_placeholder);
  pBar.setVisibility(View.VISIBLE);

  if (objElement.endsWith(mp3_Pattern)) {
     Log.e("Mp3 ", " ends with ");
     pBar.setVisibility(View.GONE);
     imageView.setImageResource(R.drawable.audio_control);
  }
  if (objElement.endsWith(png_Pattern)) {
     Bitmap bitmap = BitmapFactory.decodeFile(objElement);
     int size = Math.min(bitmap.getWidth(), bitmap.getHeight());
     int x = (bitmap.getWidth() - size) / 2;
     int y = (bitmap.getHeight() - size) / 2;
     Bitmap bitmap_Resul = Bitmap.createBitmap(bitmap, x, y, size, size);
     Log.e("bitmap_Resul "," = "+ bitmap_Resul);

     if (bitmap_Resul != bitmap) {
        bitmap.recycle();
     }
     imageView.setImageBitmap(bitmap_Resul);
     Log.e("png_Pattern ", " ends with ");
     Log.e(" bitmap "," = " + bitmap);
  }

  holder.linearLayout.addView(imageView);
  holder.linearLayout.addView(pBar);

ข้อมูลบันทึกแมว:

08-27 14:11:15.307    1857-1857/? E/AndroidRuntime FATAL EXCEPTION: main
    Process: com.example.tazeen.classnkk, PID: 1857
    java.lang.OutOfMemoryError: Failed to allocate a 23970828 byte allocation with 2097152 free bytes and 2MB until OOM
            at dalvik.system.VMRuntime.newNonMovableArray(Native Method)
            at android.graphics.Bitmap.nativeCreate(Native Method)
            at android.graphics.Bitmap.createBitmap(Bitmap.java:812)
            at android.graphics.Bitmap.createBitmap(Bitmap.java:789)
            at android.graphics.Bitmap.createBitmap(Bitmap.java:709)
            at android.graphics.Bitmap.createBitmap(Bitmap.java:634)
            at com.example.tazeen.classnkk.AllPosts_Page$MyListAdapter.getView(AllPosts_Page.java:357)
            at android.widget.AbsListView.obtainView(AbsListView.java:2347)
            at android.widget.ListView.makeAndAddView(ListView.java:1864)
            at android.widget.ListView.fillDown(ListView.java:698)
            at android.widget.ListView.fillFromTop(ListView.java:759)
            at android.widget.ListView.layoutChildren(ListView.java:1659)
            at android.widget.AbsListView.onLayout(AbsListView.java:2151)
            at android.view.View.layout(View.java:15671)
            at android.view.ViewGroup.layout(ViewGroup.java:5038)
            at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1703)
            at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1557)
            at android.widget.LinearLayout.onLayout(LinearLayout.java:1466)
            at android.view.View.layout(View.java:15671)
            at android.view.ViewGroup.layout(ViewGroup.java:5038)
            at android.widget.FrameLayout.layoutChildren(FrameLayout.java:579)
            at android.widget.FrameLayout.onLayout(FrameLayout.java:514)
            at android.view.View.layout(View.java:15671)
            at android.view.ViewGroup.layout(ViewGroup.java:5038)
            at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1703)
            at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1557)
            at android.widget.LinearLayout.onLayout(LinearLayout.java:1466)
            at android.view.View.layout(View.java:15671)
            at android.view.ViewGroup.layout(ViewGroup.java:5038)
            at android.widget.FrameLayout.layoutChildren(FrameLayout.java:579)
            at android.widget.FrameLayout.onLayout(FrameLayout.java:514)
            at android.view.View.layout(View.java:15671)
            at android.view.ViewGroup.layout(ViewGroup.java:5038)
            at android.view.ViewRootImpl.performLayout(ViewRootImpl.java:2086)
            at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1843)
            at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1061)
            at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:5885)
            at android.view.Choreographer$CallbackRecord.run(Choreographer.java:767)
            at android.view.Choreographer.doCallbacks(Choreographer.java:580)
            at android.view.Choreographer.doFrame(Choreographer.java:550)
            at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:753)
            at android.os.Handler.handleCallback(Handler.java:739)
            at android.os.Handler.dispatchMessage(Handler.java:95)
            at android.os.Looper.loop(Looper.java:135)
            at android.app.ActivityThread.main(ActivityThread.java:5257)
            at java.lang.reflect.Method.invoke(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:372)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698)

4
ตรวจสอบพิกเซลของภาพความกว้างต้องไม่เกิน 1440 และสูง 2560 โดยการทำเช่นนี้มันจะไม่แสดงOutOfMemoryError
Pankaj Lilan

1
@PankajLilan คุณหาค่าเหล่านี้ได้ที่ไหน (1440 X 2560)? การอ้างอิงใด ๆ จากเอกสาร Android?
LCJ

คำตอบ:


525

OutOfMemoryErrorเป็นปัญหาที่พบบ่อยที่สุดใน Android ในขณะที่จัดการกับบิตแมปโดยเฉพาะ ข้อผิดพลาดนี้ถูกโยนโดย Java Virtual Machine (JVM) เมื่อไม่สามารถจัดสรรวัตถุได้เนื่องจากพื้นที่หน่วยความจำไม่เพียงพอและตัวรวบรวมขยะไม่สามารถเพิ่มพื้นที่ว่างได้

ดังที่ Aleksey ได้กล่าวไว้คุณสามารถเพิ่มเอนทิตีด้านล่างลงในไฟล์ Manifest ของคุณandroid:hardwareAccelerated="false"ซึ่งandroid:largeHeap="true"จะใช้ได้กับบางสภาพแวดล้อม

<application
    android:allowBackup="true"
    android:hardwareAccelerated="false"
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"
    android:largeHeap="true"
    android:supportsRtl="true"
    android:theme="@style/AppTheme">

คุณควรอ่านแนวคิดนักพัฒนา Androids อย่างแน่นอนโดยเฉพาะที่นี่: การแสดงบิตแมปอย่างมีประสิทธิภาพ

อ่านทั้งหมด 5 หัวข้อและเขียนรหัสของคุณอีกครั้ง หากยังใช้งานไม่ได้เรายินดีที่จะเห็นสิ่งที่คุณทำผิดกับเนื้อหาการสอน

ต่อไปนี้เป็นคำตอบที่เป็นไปได้สำหรับข้อผิดพลาดประเภทนี้ใน SOF

Android: BitmapFactory.decodeStream () ออกจากหน่วยความจำด้วยไฟล์ 400KB พร้อม heap ฟรี 2MB

วิธีแก้ปัญหา java.lang.OutOfMemoryError ใน Android

Android: java.lang.OutOfMemoryError

java.lang.OutOfMemoryError

โซลูชันสำหรับ OutOfMemoryError: ขนาดบิตแมปเกินงบประมาณ VM

แก้ไข: จากความคิดเห็นของ @cjnash

สำหรับใครก็ตามที่ยังคงมีปัญหาหลังจากพวกเขาเพิ่มบรรทัดนี้ลองติดภาพของคุณลงใน res / drawable-xhdpi / โฟลเดอร์แทนที่จะเป็น res / drawable ของคุณและอาจแก้ไขปัญหาของคุณ


1
คุณช่วยโพสต์ได้อย่างไรว่าในที่สุดคุณจะแก้ปัญหา เพราะฉันมีปัญหาเดียวกัน ... จริง ๆ แล้วคุณสามารถเพิ่มในรายการของคุณบรรทัดนี้ android: hardwareAccelerated = "false", android: largeHeap = "true" มันทำงานในบางสถานการณ์ แต่ระวังว่าอีกส่วนของรหัสสามารถ จะเถียงกับนี้ ...
Aleksey Timoshchenko

6
การนำทางแอปช้ามากหลังจากเพิ่มสิ่งนี้
Uma Achanta

10
android: hardwareAccelerated = "false" การแช่แข็งแอปของคุณ
Rahim Rahimov

1
สำหรับใครก็ตามที่ยังคงมีปัญหาหลังจากพวกเขาเพิ่มบรรทัดนี้ลองติดภาพของคุณลงใน res / drawable-xhdpi / โฟลเดอร์แทนที่จะเป็น res / drawable ของคุณและอาจแก้ไขปัญหาของคุณ
cjnash

6
ทำไมคุณถึงแนะนำ android: hardwareAccelerated = "false ประโยชน์ของมันคืออะไร?
batmaci

86

คุณลองเพิ่มสิ่งนี้ลงในไฟล์ Manifest ของคุณหรือไม่? android:largeHeap="true"?

แบบนี้

  <application
      android:name=".ParaseApplication"
      android:allowBackup="true"
      android:icon="@mipmap/ic_launcher"
      android:label="@string/app_name"
      android:theme="@style/AppTheme"
      android:largeHeap="true" >

17
ฉันได้ลองกับ android นี้แล้ว largeHeap = "true" แต่ได้รับข้อผิดพลาดเดียวกัน
androidTag

1
ลองบีบอัดภาพของคุณก่อนที่คุณจะสามารถใช้ลิงก์นี้เพื่อทำtinyjpg.com
TSG

1
คุณสามารถบีบอัด png ด้วยเว็บไซต์นี้ได้
TSG

27

สำหรับฉันปัญหาคือไฟล์. png ของฉันถูกบีบอัดให้เป็นบิตแมปขนาดใหญ่ในหน่วยความจำเพราะภาพมีขนาดใหญ่มาก (แม้ว่าขนาดไฟล์จะเล็ก)

ดังนั้นการแก้ไขคือเพียงปรับขนาดภาพ :)


3
นี่เป็นวิธีแก้ไขที่ถูกต้องเพราะฉันลองใช้วิธีแก้ไขปัญหาก่อนหน้านี้ แต่หลังจากใช้ไปandroid:hardwareAccelerated="false"แล้วภาพเคลื่อนไหวบางอย่างเช่นเค้าโครงเงาไม่ทำงาน แต่หลังจากปรับขนาดปัญหาทั้งหมดได้รับการแก้ไขแล้วขอขอบคุณ! +1 สำหรับคำใบ้นี้!
Kaushal28

1
นี่เป็นการแก้ไขปัญหาของฉัน ขอบคุณ @petrus
HùngNguyễn

27

ที่จริงคุณสามารถเพิ่มในสาย Manifest ของเหล่านี้android:hardwareAccelerated="false", android:largeHeap="true"มันคือการทำงานสำหรับบางสถานการณ์ แต่ทราบว่าส่วนอื่น ๆ ของรหัสสามารถเถียงกับเรื่องนี้

<application
    android:allowBackup="true"
    android:hardwareAccelerated="false"
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"
    android:largeHeap="true"
    android:supportsRtl="true"
    android:theme="@style/AppTheme">

2
ไม่ทำงานมันล้มเหลวด้วยข้อผิดพลาดเดียวกันเมื่อใช้ Bitmap.createBitmap
Narendra Singh

@King ขออภัย (ฉันยังใช้เวลาในการแก้ปัญหานี้และมันใช้งานได้สำหรับฉัน แต่มันเป็นเพียงหนึ่งในวิธี ... มีวิธีการมากมายที่แตกต่างกัน
Aleksey Timoshchenko

2
Androidมีวัตถุประสงค์อะไร: hardwareAccelerated = "false" ?
IgorGanapolsky

@IgorGanapolsky จากเอกสารทางการบอกว่า .. ดูลิงค์นี้
Shylendra Madda

27

สิ่งนี้น่าจะใช้ได้

 BitmapFactory.Options options = new BitmapFactory.Options();
 options.inSampleSize = 8;

 mBitmapSampled = BitmapFactory.decodeFile(mCurrentPhotoPath,options);

11

ปรับขนาดภาพของคุณก่อนตั้งค่าเป็น ImageView เช่นนี้:

Bitmap.createScaledBitmap(_yourImageBitmap, _size, _size, false);

โดยที่ size เป็นขนาดที่แท้จริงของ ImageView คุณสามารถเข้าถึงขนาดโดยการวัด:

imageView.measure(MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED), MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED));

และใช้ขนาดต่อไปimageView.getMeasuredWidth()และสำหรับimageView.getMeasuredHeight()scaling


ฉันได้ลองกับ android นี้แล้ว largeHeap = "true" แต่ได้รับข้อผิดพลาดเดียวกัน
androidTag

ตัวอย่างเพิ่มเติมเกี่ยวกับสาเหตุที่ไม่สามารถใช้งานได้ (โดยใช้ที่เก็บส่วนตัวของแอป): การวางบิตแมปใน res / drawable / สามารถให้ข้อผิดพลาดเดียวกันได้ แต่จะไม่เกิดขึ้นทุกครั้ง การวางบิตแมปเดียวกันไว้ใน res / drawable-xhdpi / จะไม่มีข้อผิดพลาดอีกต่อไป ดังนั้นคำตอบมันไม่ถูกต้อง
CmosBattery

8

ใช้Glide Libraryและ Override size เพื่อขนาดที่น้อยลง

Glide.with(mContext).load(imgID).asBitmap().override(1080, 600).into(mImageView);

6

ฉันพบข้อผิดพลาดด้านล่าง

"E / art: การขว้าง OutOfMemoryError" ล้มเหลวในการจัดสรรการจัดสรรไบต์ 47251468 ด้วยไบต์ฟรี 16777120 และ 23MB จนกระทั่ง OOM "

หลังจากเพิ่มandroid:largeHeap="true"ในAndroidManifest.xmlแล้วฉันจะกำจัดข้อผิดพลาดทั้งหมด

<application
    android:allowBackup="true"
    android:icon="@mipmap/guruji"
    android:label="@string/app_name"
    android:supportsRtl="true"
    android:largeHeap="true"
    android:theme="@style/AppTheme">

4

ฉันแก้ไขปัญหานี้ด้วยการปรับขนาดภาพให้เล็กลง ฉันใช้รูปแบบซามาริน การลดขนาดของภาพ PNG สามารถแก้ไขปัญหาได้


4

ปัญหา: ล้มเหลวในการจัดสรรการจัดสรร 37748748 ไบต์ด้วย 16777120 ไบต์ฟรีและ 17MB จนกว่า OOM

วิธีแก้ไข: 1. เปิดไฟล์รายการ 2. ภายในแท็กแอปพลิเคชันเพียงเพิ่มด้านล่างสองบรรทัด

 android:hardwareAccelerated="false"
 android:largeHeap="true"

ตัวอย่าง:

 <application
        android:allowBackup="true"
        android:hardwareAccelerated="false"
        android:largeHeap="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">

4

ฉันพบว่ารูปภาพในโฟลเดอร์ 'drawable' จะถูกแปลงเป็นรูปภาพขนาดใหญ่กว่ามากบนโทรศัพท์ high def ตัวอย่างเช่นภาพขนาด 200k จะถูกปรับให้มีความละเอียดสูงขึ้นเช่น 800k หรือ 32000k ฉันต้องค้นพบสิ่งนี้ด้วยตัวเองและจนถึงปัจจุบันยังไม่เห็นเอกสารประกอบสำหรับกับดักหน่วยความจำฮีปนี้ เพื่อป้องกันสิ่งนี้ฉันใส่ทุกอย่างไว้ในโฟลเดอร์ drawable-nodpi (นอกเหนือจากการใช้ 'options' ใน BitmapFactory ตามอุปกรณ์เฉพาะฮีป) ฉันไม่สามารถที่จะมีขนาดของแอปของฉันป่องด้วยหลายโฟลเดอร์ drawable โดยเฉพาะอย่างยิ่งช่วง defs ของหน้าจอมีมากมายในขณะนี้ สิ่งที่ยุ่งยากคือตอนนี้สตูดิโอไม่ได้ระบุโฟลเดอร์ 'drawable-nodpi' เป็นพิเศษในมุมมองโปรเจ็กต์มันแสดงเฉพาะโฟลเดอร์ 'drawable' หากคุณไม่ระวังเมื่อคุณวางภาพไปยังโฟลเดอร์นี้ในสตูดิโอมันจะชนะ '

Careful here 'backgroundtest' did not actually go to drawable-nodpi and will 
be resampled higher, such as 4x or 16x of the original dimensions for high def screens.

ป้อนคำอธิบายรูปภาพที่นี่

อย่าลืมคลิกลงไปที่โฟลเดอร์ nodpi ในกล่องโต้ตอบเนื่องจากมุมมองโปรเจ็กต์จะไม่แสดงโฟลเดอร์ที่คุณวาดได้ทั้งหมดแยกจากกันอย่างที่เคยเป็นดังนั้นมันจะไม่ปรากฏทันทีว่ามันผิด Studio สร้าง vanilla 'drawable' ขึ้นใหม่ในบางช่วงหลังจากที่ฉันลบไปนานแล้ว:

ป้อนคำอธิบายรูปภาพที่นี่


3

สิ่งนี้ใช้ได้กับฉัน: เพียงแค่ย้ายรูปภาพจากโฟลเดอร์ drawable ไปเป็น drawable-hdpi


คำอธิบายของสิ่งนี้คืออะไร? เหตุใดการเคลื่อนไหวนี้จึงใช้ได้
Harun

กรุณาอธิบายว่าทำไมจึงใช้งานได้ ...
X-Black ...

3

ลองใช้ Soluton ในไฟล์ Manifest และใช้ Glide Library

รวบรวม 'com.github.bumptech.glide: ร่อน: 3.7.0'

    **Use Glide Library and Override size to less size;**

 if (!TextUtils.isEmpty(message.getPicture())) {
            Glide.with(mContext).load(message.getPicture())
                    .thumbnail(0.5f)
                    .crossFade()
                    .transform(new CircleTransform(mContext))
                    .diskCacheStrategy(DiskCacheStrategy.ALL)
                    .into(holder.imgProfile);
        } 

หุ่นยนต์: hardwareAccelerated = "false"

หุ่นยนต์: largeHeap = "true"

<application
    android:allowBackup="true"
    android:hardwareAccelerated="false"
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"
    android:largeHeap="true"
    android:supportsRtl="true"
    android:theme="@style/AppTheme">

ใช้ไลบรารีนี้

  compile 'com.github.bumptech.glide:glide:3.7.0'   

มันทำงานได้ดี

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapShader;
import android.graphics.Canvas;
import android.graphics.Paint;

import com.bumptech.glide.load.engine.bitmap_recycle.BitmapPool;
import com.bumptech.glide.load.resource.bitmap.BitmapTransformation;


public class CircleTransform extends BitmapTransformation {
    public CircleTransform(Context context) {
        super(context);
    }

    @Override
    protected Bitmap transform(BitmapPool pool, Bitmap toTransform, int outWidth, int outHeight) {
        return circleCrop(pool, toTransform);
    }

    private static Bitmap circleCrop(BitmapPool pool, Bitmap source) {
        if (source == null) return null;

        int size = Math.min(source.getWidth(), source.getHeight());
        int x = (source.getWidth() - size) / 2;
        int y = (source.getHeight() - size) / 2;

        // TODO this could be acquired from the pool too
        Bitmap squared = Bitmap.createBitmap(source, x, y, size, size);

        Bitmap result = pool.get(size, size, Bitmap.Config.ARGB_8888);
        if (result == null) {
            result = Bitmap.createBitmap(size, size, Bitmap.Config.ARGB_8888);
        }

        Canvas canvas = new Canvas(result);
        Paint paint = new Paint();
        paint.setShader(new BitmapShader(squared, BitmapShader.TileMode.CLAMP, BitmapShader.TileMode.CLAMP));
        paint.setAntiAlias(true);
        float r = size / 2f;
        canvas.drawCircle(r, r, r, paint);
        return result;
    }

    @Override
    public String getId() {
        return getClass().getName();
    }
}

3

เพิ่มสิ่งนี้ในรายการของคุณภายใต้แอปพลิเคชันหรือไม่ หุ่นยนต์: largeHeap = "true"


ยังมีอีกวิธีแก้ปัญหาหนึ่ง: เปลี่ยน height = height * .75 และ width = width * .75
SAURABH OMER

2

ฉันมีปัญหาเช่นกัน

เหมือนกับคนอื่น ๆ ส่วนใหญ่ด้านบน ปัญหาเกิดจากภาพขนาดใหญ่

เพียงปรับขนาดภาพบางส่วนและไม่จำเป็นต้องเปลี่ยนรหัสใด ๆ



1

ฉันเป็นมือใหม่ในการพัฒนา Android แต่ฉันหวังว่าโซลูชันของฉันจะช่วยได้ ฉันใช้ Imageview และตั้งค่าพื้นหลังเป็น "src" เพราะฉันพยายามสร้างภาพเคลื่อนไหวเฟรม ฉันได้รับข้อผิดพลาดเดียวกัน แต่เมื่อฉันพยายามรหัสมันทำงานได้

int ImageID = this.Resources.GetIdentifier(questionPlay[index].Image.ToLower(), "anim", PackageName);
            imgView.SetImageResource(ImageID);
            AnimationDrawable animation = (AnimationDrawable)imgView.Drawable;
            animation.Start();
            animation.Dispose();

1

ฉันพบปัญหานี้เมื่อฉันไม่ได้ฆ่ากิจกรรมเก่าของฉันเมื่อย้ายไปทำกิจกรรมใหม่ ฉันแก้ไขมันด้วยfinish();

    Intent goToMain = new Intent(this,MainActivity.class);
    startActivity(goToMain);
    finish();

1
Bitmap image =((BitmapDrawable)imageView1.getDrawable()).getBitmap();

ByteArrayOutputStream byteArrayOutputStream=new ByteArrayOutputStream();

image.compress(Bitmap.CompressFormat.JPEG,50/100,byteArrayOutputStream);

50/100 ถ้าใช้ 100 ความละเอียดดั้งเดิมจะทำให้แอปหมดหน่วยความจำ

ถ้า 50 หรือน้อยกว่า 100 นี่จะเป็นความละเอียด 50% หรือน้อยกว่า 100 ความละเอียดนี้จะช่วยป้องกันปัญหาหน่วยความจำไม่เพียงพอ


1

คุณต้องเปลี่ยนขนาดของวัตถุในรูปวาดได้ มันใหญ่เกินไปสำหรับ Android ที่จะแสดง เช่นหากคุณตั้งค่าภาพลองใช้ภาพที่มีพิกเซลน้อยกว่า มันใช้งานได้สำหรับฉัน ขอบคุณ :)


1

แอปของคุณหยุดทำงานเนื่องจากขนาดภาพของคุณ (เป็น MB หรือ KB) ใหญ่เกินไปดังนั้นจึงไม่ได้จัดสรรพื้นที่สำหรับสิ่งนั้น ดังนั้นก่อนที่จะวางภาพของคุณในรูปวาดได้ให้ลดขนาดลง

หรือ

คุณสามารถเพิ่มการติดตามในแอปพลิเคชันแท็กที่ Manifest.xml

 android:hardwareAccelerated="false"
    android:largeHeap="true"
    android:allowBackup="true"

หลังจากเพิ่มแอพนี้จะไม่ผิดพลาด

  • ใช้รูปภาพที่มีขนาดน้อยลงในแอปเสมอ
  • หากคุณเพิ่มรูปภาพขนาดใหญ่ในแอปคุณควรเพิ่มข้างบน syntex แต่ขนาดของแอปจะเพิ่มขึ้น

1

ปัญหาของฉันแก้ไขได้หลังจากเพิ่ม

 dexOptions {
        incremental true
        javaMaxHeapSize "4g"
        preDexLibraries true
        dexInProcess = true
    }

ในไฟล์ Build.Gradle


นี่ทำให้แอปของคุณมีการใช้งานหน่วยความจำมาก
เกินไป

@ cricket_007 อะไรคือผลลัพธ์ของสิ่งนั้นถ้ามี?
Sreekanth Karumanaghat

1
Last but not the least....

Try Method One:

Simple Add these lines of code in the gradle file

dexOptions {
        incremental true
        javaMaxHeapSize "4g"
     }

Example:

android {
    compileSdkVersion XX
    buildToolsVersion "28.X.X"

    defaultConfig {
        applicationId "com.example.xxxxx"
        minSdkVersion 14
        targetSdkVersion 19
    }

dexOptions {
        incremental true
        javaMaxHeapSize "4g"
     }
}

*******************************************************************

Method Two:

Add these two lines of code in manifest file...

android:hardwareAccelerated="false" 
android:largeHeap="true"

Example:

<application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:hardwareAccelerated="false"
        android:largeHeap="true"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name=".MainActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

It will Work for sure any of these cases.....

0

หากการอัพโหลดภาพลองลดคุณภาพของภาพซึ่งเป็นพารามิเตอร์ที่สองของบิตแมป นี่คือทางออกในกรณีของฉัน ก่อนหน้านี้มันคือ 90 จากนั้นฉันลองด้วย 60 (เพราะมันอยู่ในรหัสด้านล่างตอนนี้)

Bitmap yourSelectedImage = BitmapFactory.decodeStream(imageStream);
ByteArrayOutputStream baos = new ByteArrayOutputStream();
finalBitmap.compress(Bitmap.CompressFormat.JPEG,60,baos);
byte[] b = baos.toByteArray();

0

ลองสิ่งที่ง่ายที่สุด บางทีแอปของคุณอาจทำงานล้มเหลวเนื่องจากขนาดภาพของคุณ (เป็น MB) ใหญ่เกินไปดังนั้นจึงไม่ได้จัดสรรพื้นที่สำหรับสิ่งนั้น ดังนั้นก่อนที่จะวางภาพของคุณในรูปวาดได้เพียงลดขนาดด้วยซอฟต์แวร์ตัวแสดงผลใด ๆ หรือถ้าคุณกำลังถ่ายภาพจากแกลเลอรี่ในเวลาทำงานมากกว่าก่อนที่จะบันทึกมันบีบอัดบิตแมปของคุณ มันใช้งานได้สำหรับฉัน แน่นอนสำหรับคุณจะเป็น


0
stream = activity.getContentResolver().openInputStream(uri);
BitmapFactory.Options options = new BitmapFactory.Options();
options.inPreferredConfig = Bitmap.Config.RGB_565;

bitmap = BitmapFactory.decodeStream(stream, null, options);
int Height = bitmap.getHeight();
int Width = bitmap.getWidth();
enter code here
int newHeight = 1000;
float scaleFactor = ((float) newHeight) / Height;
float newWidth = Width * scaleFactor;

float scaleWidth = scaleFactor;
float scaleHeight = scaleFactor;
Matrix matrix = new Matrix();
matrix.postScale(scaleWidth, scaleHeight);
resizedBitmap= Bitmap.createBitmap(bitmap, 0, 0,Width, Height, matrix, true);
bitmap.recycle();

จากนั้นในแท็ก Appliaction เพิ่ม largeheapsize = "true


0

ฉันคิดว่าคุณต้องการใช้ภาพนี้เป็นไอคอน Android กำลังบอกคุณภาพของคุณใหญ่เกินไป สิ่งที่คุณต้องทำคือปรับขนาดภาพของคุณเพื่อให้ Android รู้ว่าขนาดของภาพที่จะใช้และตามความละเอียดหน้าจอ ในการทำสิ่งนี้ให้สำเร็จใน Android Studio: 1. คลิกขวาที่โฟลเดอร์ res 2. เลือก Image Image 3. เลือกไอคอน Type 4. ตั้งชื่อไอคอน 5. เลือก Image บนประเภทสินทรัพย์ 6. ตัดภาพของคุณคลิกถัดไปและเสร็จสิ้น . ใน xml หรือซอร์สโค้ดของคุณเพียงแค่อ้างถึงรูปภาพซึ่งจะอยู่ในโฟลเดอร์ layout หรือ mipmap ตามประเภทของสินทรัพย์ที่เลือก ข้อผิดพลาดจะหายไป


0

ฉันไม่แนะนำให้แก้ไขอย่างชัดแจ้งเช่นนี้

android: hardwareAccelerated = "false", android: largeHeap = "true"

ตัวเลือกเหล่านี้ทำให้เอนิเมชั่นเอฟเฟกต์ไม่ราบรื่นบนแอปของคุณ นอกจากนี้ 'liveData' หรือเปลี่ยนฐานข้อมูลท้องถิ่นของคุณ (Sqlite, Room) จะเปิดใช้งานช้า มันไม่ดีสำหรับประสบการณ์ของผู้ใช้

ดังนั้นฉันขอแนะนำบิตแมป RESIZE

ด้านล่างนี้คือตัวอย่างรหัส

fun resizeBitmap(source: Bitmap): Bitmap {
      val maxResolution = 1000    //edit 'maxResolution' to fit your need
      val width = source.width
      val height = source.height
      var newWidth = width
      var newHeight = height
      val rate: Float

            if (width > height) {
                if (maxResolution < width) {
                    rate = maxResolution / width.toFloat()
                    newHeight = (height * rate).toInt()
                    newWidth = maxResolution
                }
            } else {
                if (maxResolution < height) {
                    rate = maxResolution / height.toFloat()
                    newWidth = (width * rate).toInt()
                    newHeight = maxResolution
                }
            }
            return Bitmap.createScaledBitmap(source, newWidth, newHeight, true)
 }

0

ถ้า android: largeHeap = "true" ไม่ได้ผลสำหรับคุณ

1:

การบีบอัดภาพ ฉันใช้เว็บไซต์นี้

2:

แปลงภาพเป็น mdpi, hdpi, xhdpi, xxhdpi, xxxhdpi ฉันใช้webisteนี้

อย่าลบ Android: largeHeap = "true"!


โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.