出的Andr​​oid记忆有关PNG图像 [英] Android Out of memory regarding png image

查看:151
本文介绍了出的Andr​​oid记忆有关PNG图像的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我在我的应用程序的JPG图像的正确显示。在我的列表视图我想使图像更加透明,这样很容易看到的文字。我改变了形象为PNG格式,并改变它在GIMP透明度。

现在,新的图像是在应用程序绘制文件夹。即时得到下面的错误。为什么?

  9月9日至28日:24:07.560:I /全球(20140):呼叫套接字关闭,tmpsocket =插座[地址= / 178.250.50.40,端口= 80,将localPort = 35172 ]
9月9日至28日:24:07.570:I /全球(20140):呼叫套接字关闭,tmpsocket =插座[地址= / 212.169.27.217,端口= 84,将localPort = 55656]
9月9日至28日:24:07.690:D / dalvikvm(20140):GC_FOR_ALLOC释放113K,4%免​​费38592K / 39907K,暂停为32ms
9月9日至28日:24:07.690:I / dalvikvm堆(20140):强制SoftReferences的收集28072816字节分配
9月9日至28日:24:07.740:D / dalvikvm(20140):GC_BEFORE_OOM释放9K,免费4%38582K / 39907K,持续时间43ms暂停
9月9日至28日:24:07.740:E / dalvikvm堆(20140):出于对28072816字节分配内存。
9月9日至28日:24:07.740:I / dalvikvm(20140):主PRIO = 5 TID = 1 RUNNABLE
9月9日至28日:24:07.740:I / dalvikvm(20140):|组=主SCOUNT = 0 dsCount = 0 = OBJ自我0x40a57490 = 0x1b6e9a8
9月9日至28日:24:07.740:I / dalvikvm(20140):| sysTid = 20140漂亮= 0 =附表0/0 = CGRP默认手柄= 1074361640
9月9日至28日:24:07.740:I / dalvikvm(20140):| schedstat =(2289118000 760844000 2121)UTM = 195 STM = 33核心= 1
9月9日至28日:24:07.740:I / dalvikvm(20140):在android.graphics.BitmapFactory.nativeDe $ C $检测板(本机方法)
9月9日至28日:24:07.740:I / dalvikvm(20140):在android.graphics.BitmapFactory.de codeResourceStream(BitmapFactory.java:486)
9月9日至28日:24:07.740:I / dalvikvm(20140):在android.graphics.drawable.Drawable.createFromResourceStream(Drawable.java:773)
9月9日至28日:24:07.740:I / dalvikvm(20140):在android.content.res.Resources.loadDrawable(Resources.java:2042)
9月9日至28日:24:07.740:I / dalvikvm(20140):在android.content.res.TypedArray.getDrawable(TypedArray.java:601)
9月9日至28日:24:07.740:I / dalvikvm(20140):在android.view.View<&初始化GT;(View.java:2812)。
9月9日至28日:24:07.740:I / dalvikvm(20140):在android.view.ViewGroup<&初始化GT;(ViewGroup.java:410)。
9月9日至28日:24:07.740:I / dalvikvm(20140):在android.widget.LinearLayout<&初始化GT;(LinearLayout.java:174)。
9月9日至28日:24:07.740:I / dalvikvm(20140):在android.widget.LinearLayout<&初始化GT;(LinearLayout.java:170)。
9月9日至28日:24:07.740:I / dalvikvm(20140):在java.lang.reflect.Constructor.constructNative(本机方法)
9月9日至28日:24:07.740:I / dalvikvm(20140):在java.lang.reflect.Constructor.newInstance(Constructor.java:417)
9月9日至28日:24:07.740:I / dalvikvm(20140):在android.view.LayoutInflater.createView(LayoutInflater.java:586)
9月9日至28日:24:07.740:I / dalvikvm(20140):在com.android.internal.policy.impl.PhoneLayoutInflater.onCreateView(PhoneLayoutInflater.java:56)
9月9日至28日:24:07.740:I / dalvikvm(20140):在android.view.LayoutInflater.onCreateView(LayoutInflater.java:653)
9月9日至28日:24:07.740:I / dalvikvm(20140):在android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:678)
9月9日至28日:24:07.740:I / dalvikvm(20140):在android.view.LayoutInflater.inflate(LayoutInflater.java:466)
9月9日至28日:24:07.740:I / dalvikvm(20140):在android.view.LayoutInflater.inflate(LayoutInflater.java:396)
9月9日至28日:24:07.740:I / dalvikvm(20140):在android.view.LayoutInflater.inflate(LayoutInflater.java:352)
9月9日至28日:24:07.740:I / dalvikvm(20140):在com.android.internal.policy.impl.PhoneWindow.setContentView(PhoneWindow.java:278)
9月9日至28日:24:07.740:I / dalvikvm(20140):在android.app.Activity.setContentView(Activity.java:1897)
9月9日至28日:24:07.740:I / dalvikvm(20140):在com.carefreegroup.ShowMoreDetails.onCreate(ShowMoreDetails.java:26)
9月9日至28日:24:07.740:I / dalvikvm(20140):在android.app.Activity.performCreate(Activity.java:4543)
9月9日至28日:24:07.740:I / dalvikvm(20140):在android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1071)
9月9日至28日:24:07.740:I / dalvikvm(20140):在android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2181)
9月9日至28日:24:07.740:I / dalvikvm(20140):在android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2260)
9月9日至28日:24:07.740:I / dalvikvm(20140):在android.app.ActivityThread.access $ 600(ActivityThread.java:139)
9月9日至28日:24:07.740:I / dalvikvm(20140):在android.app.ActivityThread $ H.handleMessage(ActivityThread.java:1277)
9月9日至28日:24:07.740:I / dalvikvm(20140):在android.os.Handler.dispatchMessage(Handler.java:99)
9月9日至28日:24:07.740:I / dalvikvm(20140):在android.os.Looper.loop(Looper.java:156)
9月9日至28日:24:07.740:I / dalvikvm(20140):在android.app.ActivityThread.main(ActivityThread.java:5045)
9月9日至28日:24:07.740:I / dalvikvm(20140):在java.lang.reflect.Method.invokeNative(本机方法)
9月9日至28日:24:07.740:I / dalvikvm(20140):在java.lang.reflect.Method.invoke(Method.java:511)
9月9日至28日:24:07.740:I / dalvikvm(20140):在com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:784)
9月9日至28日:24:07.740:I / dalvikvm(20140):在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
9月9日至28日:24:07.740:I / dalvikvm(20140):在dalvik.system.NativeStart.main(本机方法)
9月9日至28日:24:07.740:E / dalvikvm(20140):内存:堆大小= 46115KB,分配= 38582KB,限= 65536KB
9月9日至28日:24:07.740:E / dalvikvm(20140):额外的信息:足迹= 39907KB,允许的足迹= 46115KB,裁剪= 892KB
9月9日至28日:24:07.740:E / Bitmap_JNI(20140):创建位图失败。
9月9日至28日:24:07.740:在0x00000004(code = 1)致命信号11(SIGSEGV):A / libc的(20140)
9月9日至28日:24:09.750:I / dalvikvm(20367):打开JNI的​​应用程序错误的解决方法目标SDK版本10 ...
9月9日至28日:24:09.940:D / dalvikvm(20367):GC_CONCURRENT释放864K,21%免费3797K / 4771K,暂停2MS + 2ms的

感谢。

[更新]

  @覆盖
    保护无效的onCreate(捆绑savedInstanceState){
        super.onCreate(savedInstanceState);
        的setContentView(R.layout.showmoredetailslayout);
        actualCallTime =(的TextView)findViewById(R.id.actualcalltime);
        doubleUp =(的TextView)findViewById(R.id.doubleupcallid);
        needName =(的TextView)findViewById(R.id.needname);
        needNameLabel =(的TextView)findViewById(R.id.neednamelabel);
        getRotaDetails =(按钮)findViewById(R.id.buttongetrotadetails);
        意图= this.getIntent();
        串actualTimeIn = intent.getStringExtra(actTimeIn);
        串actualTimeOut = intent.getStringExtra(actTimeOut);
        串doubleUpValue = intent.getStringExtra(doubleUpValue);
        串needNameWithCommas = intent.getStringExtra(needNameWithCommas);
        CALLID = intent.getStringExtra(CALLID);
        串[]需要= needNameWithCommas.split(,);        actualCallTime.setText( - + actualTimeIn +这个称呼是在完成了+ actualTimeOut);
        如果(!doubleUpValue.equalsIgnoreCase()|| doubleUpValue.equalsIgnoreCase(])){
        doubleUp.setText(这个称呼是不是双达);
        }其他{            doubleUp.setText(这个电话是一个双达+ doubleUpValue);
        }        needNameLabel.setText(呼叫宗旨:);        的for(int i = 0; I< needs.length;我++){
        needName.append(需要[I] +\\ n);
        }        getRotaDetails.setOnClickListener(新OnClickListener(){            @覆盖
            公共无效的onClick(视图v){                意向意图=新意图(ShowMoreDetails.this,GetRotaDetails.class);
                intent.putExtra(callIDExtra,CALLID);
                startActivity(意向);            }
        });
    }}


解决方案

由于@Benito说,PNG JPG需要的内存的两倍。因此,您的选项是:


  1. 缩小图像的大小。


  2. 使用JPG格式,并使用阿尔法它。不幸的是,你可以不设置在XMLα,所以你应该这样做编程方式(见下文)。


我会建议,即使您选择选项2,因为即使它在您的手机上,以减少图像大小,其他型号可能有更少的内存。从日志,似乎你的形象是关于2K * 3K,这是更大的大概所有的屏幕在那里。

 查看= findViewById(R.id.background);
可绘制背景= view.getBackground();
background.setAlpha(80);

I have a jpg image in my app that shows correctly. In my listview i'd like to make the image more transparent so it is easier to see the text. I changed the image to a png format and altered it's opacity in GIMP.

Now that the new image is in the app drawable folder. Im getting the following error. why?

   09-28 09:24:07.560: I/global(20140): call socket shutdown, tmpsocket=Socket[address=/178.250.50.40,port=80,localPort=35172]
09-28 09:24:07.570: I/global(20140): call socket shutdown, tmpsocket=Socket[address=/212.169.27.217,port=84,localPort=55656]
09-28 09:24:07.690: D/dalvikvm(20140): GC_FOR_ALLOC freed 113K, 4% free 38592K/39907K, paused 32ms
09-28 09:24:07.690: I/dalvikvm-heap(20140): Forcing collection of SoftReferences for 28072816-byte allocation
09-28 09:24:07.740: D/dalvikvm(20140): GC_BEFORE_OOM freed 9K, 4% free 38582K/39907K, paused 43ms
09-28 09:24:07.740: E/dalvikvm-heap(20140): Out of memory on a 28072816-byte allocation.
09-28 09:24:07.740: I/dalvikvm(20140): "main" prio=5 tid=1 RUNNABLE
09-28 09:24:07.740: I/dalvikvm(20140):   | group="main" sCount=0 dsCount=0 obj=0x40a57490 self=0x1b6e9a8
09-28 09:24:07.740: I/dalvikvm(20140):   | sysTid=20140 nice=0 sched=0/0 cgrp=default handle=1074361640
09-28 09:24:07.740: I/dalvikvm(20140):   | schedstat=( 2289118000 760844000 2121 ) utm=195 stm=33 core=1
09-28 09:24:07.740: I/dalvikvm(20140):   at android.graphics.BitmapFactory.nativeDecodeAsset(Native Method)
09-28 09:24:07.740: I/dalvikvm(20140):   at android.graphics.BitmapFactory.decodeResourceStream(BitmapFactory.java:486)
09-28 09:24:07.740: I/dalvikvm(20140):   at android.graphics.drawable.Drawable.createFromResourceStream(Drawable.java:773)
09-28 09:24:07.740: I/dalvikvm(20140):   at android.content.res.Resources.loadDrawable(Resources.java:2042)
09-28 09:24:07.740: I/dalvikvm(20140):   at android.content.res.TypedArray.getDrawable(TypedArray.java:601)
09-28 09:24:07.740: I/dalvikvm(20140):   at android.view.View.<init>(View.java:2812)
09-28 09:24:07.740: I/dalvikvm(20140):   at android.view.ViewGroup.<init>(ViewGroup.java:410)
09-28 09:24:07.740: I/dalvikvm(20140):   at android.widget.LinearLayout.<init>(LinearLayout.java:174)
09-28 09:24:07.740: I/dalvikvm(20140):   at android.widget.LinearLayout.<init>(LinearLayout.java:170)
09-28 09:24:07.740: I/dalvikvm(20140):   at java.lang.reflect.Constructor.constructNative(Native Method)
09-28 09:24:07.740: I/dalvikvm(20140):   at java.lang.reflect.Constructor.newInstance(Constructor.java:417)
09-28 09:24:07.740: I/dalvikvm(20140):   at android.view.LayoutInflater.createView(LayoutInflater.java:586)
09-28 09:24:07.740: I/dalvikvm(20140):   at com.android.internal.policy.impl.PhoneLayoutInflater.onCreateView(PhoneLayoutInflater.java:56)
09-28 09:24:07.740: I/dalvikvm(20140):   at android.view.LayoutInflater.onCreateView(LayoutInflater.java:653)
09-28 09:24:07.740: I/dalvikvm(20140):   at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:678)
09-28 09:24:07.740: I/dalvikvm(20140):   at android.view.LayoutInflater.inflate(LayoutInflater.java:466)
09-28 09:24:07.740: I/dalvikvm(20140):   at android.view.LayoutInflater.inflate(LayoutInflater.java:396)
09-28 09:24:07.740: I/dalvikvm(20140):   at android.view.LayoutInflater.inflate(LayoutInflater.java:352)
09-28 09:24:07.740: I/dalvikvm(20140):   at com.android.internal.policy.impl.PhoneWindow.setContentView(PhoneWindow.java:278)
09-28 09:24:07.740: I/dalvikvm(20140):   at android.app.Activity.setContentView(Activity.java:1897)
09-28 09:24:07.740: I/dalvikvm(20140):   at com.carefreegroup.ShowMoreDetails.onCreate(ShowMoreDetails.java:26)
09-28 09:24:07.740: I/dalvikvm(20140):   at android.app.Activity.performCreate(Activity.java:4543)
09-28 09:24:07.740: I/dalvikvm(20140):   at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1071)
09-28 09:24:07.740: I/dalvikvm(20140):   at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2181)
09-28 09:24:07.740: I/dalvikvm(20140):   at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2260)
09-28 09:24:07.740: I/dalvikvm(20140):   at android.app.ActivityThread.access$600(ActivityThread.java:139)
09-28 09:24:07.740: I/dalvikvm(20140):   at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1277)
09-28 09:24:07.740: I/dalvikvm(20140):   at android.os.Handler.dispatchMessage(Handler.java:99)
09-28 09:24:07.740: I/dalvikvm(20140):   at android.os.Looper.loop(Looper.java:156)
09-28 09:24:07.740: I/dalvikvm(20140):   at android.app.ActivityThread.main(ActivityThread.java:5045)
09-28 09:24:07.740: I/dalvikvm(20140):   at java.lang.reflect.Method.invokeNative(Native Method)
09-28 09:24:07.740: I/dalvikvm(20140):   at java.lang.reflect.Method.invoke(Method.java:511)
09-28 09:24:07.740: I/dalvikvm(20140):   at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
09-28 09:24:07.740: I/dalvikvm(20140):   at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
09-28 09:24:07.740: I/dalvikvm(20140):   at dalvik.system.NativeStart.main(Native Method)
09-28 09:24:07.740: E/dalvikvm(20140): Out of memory: Heap Size=46115KB, Allocated=38582KB, Limit=65536KB
09-28 09:24:07.740: E/dalvikvm(20140): Extra info: Footprint=39907KB, Allowed Footprint=46115KB, Trimmed=892KB
09-28 09:24:07.740: E/Bitmap_JNI(20140): Create Bitmap Failed.
09-28 09:24:07.740: A/libc(20140): Fatal signal 11 (SIGSEGV) at 0x00000004 (code=1)
09-28 09:24:09.750: I/dalvikvm(20367): Turning on JNI app bug workarounds for target SDK version 10...
09-28 09:24:09.940: D/dalvikvm(20367): GC_CONCURRENT freed 864K, 21% free 3797K/4771K, paused 2ms+2ms

thanks.

[update]

@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.showmoredetailslayout);
        actualCallTime = (TextView)findViewById(R.id.actualcalltime);
        doubleUp = (TextView)findViewById(R.id.doubleupcallid);
        needName = (TextView)findViewById(R.id.needname);
        needNameLabel = (TextView)findViewById(R.id.neednamelabel);
        getRotaDetails = (Button)findViewById(R.id.buttongetrotadetails);
        intent = this.getIntent();
        String actualTimeIn = intent.getStringExtra("actTimeIn");
        String actualTimeOut = intent.getStringExtra("actTimeOut");
        String doubleUpValue = intent.getStringExtra("doubleUpValue");
        String needNameWithCommas = intent.getStringExtra("needNameWithCommas");
        callID = intent.getStringExtra("callID");
        String[] needs = needNameWithCommas.split(",");



        actualCallTime.setText("This call was completed at " + actualTimeIn + " -" + actualTimeOut);
        if( ! doubleUpValue.equalsIgnoreCase("") || doubleUpValue.equalsIgnoreCase("]")){
        doubleUp.setText("This call was not a double up ");
        }else{

            doubleUp.setText("This call was  a double up " + doubleUpValue);
        }

        needNameLabel.setText("Purpose of Call: ");

        for (int i = 0; i < needs.length; i++){
        needName.append( needs[i] + "\n");
        }

        getRotaDetails.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {

                Intent intent = new Intent(ShowMoreDetails.this, GetRotaDetails.class);
                intent.putExtra("callIDExtra", callID);
                startActivity(intent);

            }
        });
    }

}

解决方案

As @Benito said, PNG needs twice the memory of jpg. Therefore Your options are:

  1. Reduce the size of the image.

  2. Use JPG, and use an alpha for it. Unfortunately, you can not set alpha in xml, so you should do it programatically (see below).

I would suggest to decrease image size even if you choose option 2, as even if it works on your phone, other models may have less memory. From the log it seems your image is about 2K*3K, which is larger that probably all screens out there.

View view = findViewById(R.id.background);
Drawable background = view.getBackground();
background.setAlpha(80);

这篇关于出的Andr​​oid记忆有关PNG图像的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆