Android:3240016字节分配内存不足

Android:3240016字节分配内存不足,android,Android,我总是要面对这个问题。在同一个问题上讨论了很多问题(即,等等)。既然我对Android还很幼稚,有人能帮我吗 Logcat: 01-20 22:41:50.644: D/dalvikvm(4838): GC_BEFORE_OOM freed <1K, 14% free 55713K/64583K, paused 20ms, total 20ms 01-20 22:41:50.644: E/dalvikvm-heap(4838): Out of memory on a 3240016-byt

我总是要面对这个问题。在同一个问题上讨论了很多问题(即,等等)。既然我对Android还很幼稚,有人能帮我吗

Logcat:

01-20 22:41:50.644: D/dalvikvm(4838): GC_BEFORE_OOM freed <1K, 14% free 55713K/64583K, paused 20ms, total 20ms
01-20 22:41:50.644: E/dalvikvm-heap(4838): Out of memory on a 3240016-byte allocation.
01-20 22:41:50.644: I/dalvikvm(4838): "main" prio=5 tid=1 RUNNABLE
01-20 22:41:50.644: I/dalvikvm(4838):   | group="main" sCount=0 dsCount=0 obj=0x40e11508 self=0x40d2e9a0
01-20 22:41:50.644: I/dalvikvm(4838):   | sysTid=4838 nice=0 sched=0/0 cgrp=apps handle=1075126064
01-20 22:41:50.644: I/dalvikvm(4838):   | schedstat=( 3230609420 544631405 2986 ) utm=302 stm=21 core=0
01-20 22:41:50.644: I/dalvikvm(4838):   at android.graphics.BitmapFactory.nativeDecodeAsset(Native Method)
01-20 22:41:50.649: I/dalvikvm(4838):   at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:623)
01-20 22:41:50.649: I/dalvikvm(4838):   at android.graphics.BitmapFactory.decodeResourceStream(BitmapFactory.java:476)
01-20 22:41:50.649: I/dalvikvm(4838):   at android.graphics.drawable.Drawable.createFromResourceStream(Drawable.java:781)
01-20 22:41:50.649: I/dalvikvm(4838):   at android.content.res.Resources.loadDrawable(Resources.java:1963)
01-20 22:41:50.649: I/dalvikvm(4838):   at android.content.res.Resources.getDrawable(Resources.java:672)
01-20 22:41:50.649: I/dalvikvm(4838):   at android.view.View.setBackgroundResource(View.java:14480)
01-20 22:41:50.649: I/dalvikvm(4838):   at axaart.collectors.adapter.CustomListAdapter.getView(CustomListAdapter.java:82)
01-20 22:41:50.649: I/dalvikvm(4838):   at android.widget.AbsListView.obtainView(AbsListView.java:2461)
01-20 22:41:50.649: I/dalvikvm(4838):   at android.widget.ListView.makeAndAddView(ListView.java:1775)
01-20 22:41:50.649: I/dalvikvm(4838):   at android.widget.ListView.fillDown(ListView.java:678)
01-20 22:41:50.649: I/dalvikvm(4838):   at android.widget.ListView.fillFromTop(ListView.java:739)
01-20 22:41:50.649: I/dalvikvm(4838):   at android.widget.ListView.layoutChildren(ListView.java:1628)
01-20 22:41:50.649: I/dalvikvm(4838):   at android.widget.AbsListView.onLayout(AbsListView.java:2296)
01-20 22:41:50.649: I/dalvikvm(4838):   at android.view.View.layout(View.java:14055)
01-20 22:41:50.649: I/dalvikvm(4838):   at android.view.ViewGroup.layout(ViewGroup.java:4604)
01-20 22:41:50.654: I/dalvikvm(4838):   at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1655)
01-20 22:41:50.654: I/dalvikvm(4838):   at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1513)
01-20 22:41:50.654: I/dalvikvm(4838):   at android.widget.LinearLayout.onLayout(LinearLayout.java:1426)
01-20 22:41:50.654: I/dalvikvm(4838):   at android.view.View.layout(View.java:14055)
01-20 22:41:50.654: I/dalvikvm(4838):   at android.view.ViewGroup.layout(ViewGroup.java:4604)
01-20 22:41:50.654: I/dalvikvm(4838):   at android.widget.FrameLayout.onLayout(FrameLayout.java:448)
01-20 22:41:50.654: I/dalvikvm(4838):   at android.view.View.layout(View.java:14055)
01-20 22:41:50.654: I/dalvikvm(4838):   at android.view.ViewGroup.layout(ViewGroup.java:4604)
01-20 22:41:50.654: I/dalvikvm(4838):   at android.support.v4.view.ViewPager.onLayout(ViewPager.java:1585)
01-20 22:41:50.654: I/dalvikvm(4838):   at android.view.View.layout(View.java:14055)
01-20 22:41:50.654: I/dalvikvm(4838):   at android.view.ViewGroup.layout(ViewGroup.java:4604)
01-20 22:41:50.654: I/dalvikvm(4838):   at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1655)
01-20 22:41:50.654: I/dalvikvm(4838):   at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1513)
01-20 22:41:50.654: I/dalvikvm(4838):   at android.widget.LinearLayout.onLayout(LinearLayout.java:1426)
01-20 22:41:50.654: I/dalvikvm(4838):   at android.view.View.layout(View.java:14055)
01-20 22:41:50.654: I/dalvikvm(4838):   at android.view.ViewGroup.layout(ViewGroup.java:4604)
01-20 22:41:50.654: I/dalvikvm(4838):   at android.widget.FrameLayout.onLayout(FrameLayout.java:448)
01-20 22:41:50.654: I/dalvikvm(4838):   at android.view.View.layout(View.java:14055)
01-20 22:41:50.654: I/dalvikvm(4838):   at android.view.ViewGroup.layout(ViewGroup.java:4604)
01-20 22:41:50.654: I/dalvikvm(4838):   at android.widget.RelativeLayout.onLayout(RelativeLayout.java:948)
01-20 22:41:50.654: I/dalvikvm(4838):   at android.view.View.layout(View.java:14055)
01-20 22:41:50.654: I/dalvikvm(4838):   at android.view.ViewGroup.layout(ViewGroup.java:4604)
01-20 22:41:50.654: I/dalvikvm(4838):   at android.widget.FrameLayout.onLayout(FrameLayout.java:448)
01-20 22:41:50.654: I/dalvikvm(4838):   at android.view.View.layout(View.java:14055)
01-20 22:41:50.654: I/dalvikvm(4838):   at android.view.ViewGroup.layout(ViewGroup.java:4604)
01-20 22:41:50.654: I/dalvikvm(4838):   at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1655)
01-20 22:41:50.654: I/dalvikvm(4838):   at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1513)
01-20 22:41:50.654: I/dalvikvm(4838):   at android.widget.LinearLayout.onLayout(LinearLayout.java:1426)
01-20 22:41:50.654: I/dalvikvm(4838):   at android.view.View.layout(View.java:14055)
01-20 22:41:50.654: I/dalvikvm(4838):   at android.view.ViewGroup.layout(ViewGroup.java:4604)
01-20 22:41:50.659: I/dalvikvm(4838):   at android.widget.FrameLayout.onLayout(FrameLayout.java:448)
01-20 22:41:50.659: I/dalvikvm(4838):   at android.view.View.layout(View.java:14055)
01-20 22:41:50.659: I/dalvikvm(4838):   at android.view.ViewGroup.layout(ViewGroup.java:4604)
01-20 22:41:50.659: I/dalvikvm(4838):   at android.view.ViewRootImpl.performLayout(ViewRootImpl.java:1992)
01-20 22:41:50.659: I/dalvikvm(4838):   at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1813)
01-20 22:41:50.659: I/dalvikvm(4838):   at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1112)
01-20 22:41:50.659: I/dalvikvm(4838):   at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:4472)
01-20 22:41:50.659: I/dalvikvm(4838):   at android.view.Choreographer$CallbackRecord.run(Choreographer.java:725)
01-20 22:41:50.659: I/dalvikvm(4838):   at android.view.Choreographer.doCallbacks(Choreographer.java:555)
01-20 22:41:50.659: I/dalvikvm(4838):   at android.view.Choreographer.doFrame(Choreographer.java:525)
01-20 22:41:50.659: I/dalvikvm(4838):   at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:711)
01-20 22:41:50.659: I/dalvikvm(4838):   at android.os.Handler.handleCallback(Handler.java:615)
01-20 22:41:50.659: I/dalvikvm(4838):   at android.os.Handler.dispatchMessage(Handler.java:92)
01-20 22:41:50.659: I/dalvikvm(4838):   at android.os.Looper.loop(Looper.java:137)
01-20 22:41:50.659: I/dalvikvm(4838):   at android.app.ActivityThread.main(ActivityThread.java:4898)
01-20 22:41:50.659: I/dalvikvm(4838):   at java.lang.reflect.Method.invokeNative(Native Method)
01-20 22:41:50.659: I/dalvikvm(4838):   at java.lang.reflect.Method.invoke(Method.java:511)
01-20 22:41:50.659: I/dalvikvm(4838):   at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1006)
01-20 22:41:50.659: I/dalvikvm(4838):   at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:773)
01-20 22:41:50.659: I/dalvikvm(4838):   at dalvik.system.NativeStart.main(Native Method)
01-20 22:41:50.664: A/libc(4838): Fatal signal 11 (SIGSEGV) at 0x00000000 (code=1), thread 4838 (aart.collectors)

01-20 22:41:50.644:D/dalvikvm(4838):释放前的GC\uAndroid对单个应用程序可以为自己分配多少内存有非常严格的限制。即使设备上有可用内存,但并不意味着操作系统会将其提供给您。所以你的运气很差。以下是您可以做的一些事情:

  • 使用更高效的数据表示,而不需要如此大的分配。也许您可以在设备外部压缩/预处理web服务上的数据

  • 如果这不是一个选项,您可以构建自己的平台映像并更改每个应用程序的内存限制设置

  • 如果(2)不是您的选项。您可以编写一个本机库,它将为您保存数据。内存限制仅适用于Java/Dalvik分配。本机代码可以做它想做的任何事情

  • 建议使用imageloader。

    您使用的每个位图的内存成本为4mb。可以通过以下方法使用调整大小的位图

    private Bitmap decodeBitmap(int targetWidth, int targetHeight) throws IOException {
        final BitmapFactory.Options opts = new BitmapFactory.Options();
        opts.inJustDecodeBounds = true;
        BitmapFactory.decodeStream(getAssets().open("frog.jpg"), null, opts);
    
        opts.inSampleSize = getBitmapSampleSize(opts, targetWidth, targetHeight);
    
        opts.inJustDecodeBounds = false;
    
        return BitmapFactory.decodeStream(getAssets().open("frog.jpg"), null, opts);
    }
    
    private int getBitmapSampleSize(BitmapFactory.Options opts, int targetWidth, int targetHeight) {
        final int width = opts.outWidth;
        final int height = opts.outHeight;
        Log.d("tag", "bitmap's size is " + width + ", " + height);
        int inSampleSize = 1;
    
        if (height > targetHeight || width > targetWidth) {
            if (width > height) {
                inSampleSize = (int) Math.floor((float)height / (float)targetHeight);
            } else {
                inSampleSize = (int) Math.floor((float)width / (float)targetWidth);
            }
        }
        Log.d("tag", "target size is " + targetWidth + ", " + targetHeight);
        Log.d("tag", "inSampleSize is " + inSampleSize);
        return inSampleSize;
    }
    

    您可以尝试将此行添加到清单文件中。它将为您的应用程序分配大内存

    android:largeHeap="true"
    

    谢谢你的回复。您能否根据我的场景向我提供选项3的示例代码,我将base64字符串解码为图像并在imageview中显示相同的内容?
    private Bitmap decodeBitmap(int targetWidth, int targetHeight) throws IOException {
        final BitmapFactory.Options opts = new BitmapFactory.Options();
        opts.inJustDecodeBounds = true;
        BitmapFactory.decodeStream(getAssets().open("frog.jpg"), null, opts);
    
        opts.inSampleSize = getBitmapSampleSize(opts, targetWidth, targetHeight);
    
        opts.inJustDecodeBounds = false;
    
        return BitmapFactory.decodeStream(getAssets().open("frog.jpg"), null, opts);
    }
    
    private int getBitmapSampleSize(BitmapFactory.Options opts, int targetWidth, int targetHeight) {
        final int width = opts.outWidth;
        final int height = opts.outHeight;
        Log.d("tag", "bitmap's size is " + width + ", " + height);
        int inSampleSize = 1;
    
        if (height > targetHeight || width > targetWidth) {
            if (width > height) {
                inSampleSize = (int) Math.floor((float)height / (float)targetHeight);
            } else {
                inSampleSize = (int) Math.floor((float)width / (float)targetWidth);
            }
        }
        Log.d("tag", "target size is " + targetWidth + ", " + targetHeight);
        Log.d("tag", "inSampleSize is " + inSampleSize);
        return inSampleSize;
    }
    
    android:largeHeap="true"