关于galaxy s3的应用程序崩溃@ 240 DPI

时间:2012-10-16 17:31:05

标签: android

这个错误只是在过去一个月里杀了我。

我正在使用galaxy s3运行库存果冻豆rom,默认情况下有320 DPI。我总是将DPI更改为240,因为320 DPI看起来太大了。我过去从来没有遇到过240 DPI的任何问题。(甚至所有aosp rom的谈话应用都运行良好@ 240 DPI)。但是对于股票roms,只要收到警报并且错误消息是:

,谈话应用程序就会崩溃
10-16 21:56:59.865: E/AndroidRuntime(14559): FATAL EXCEPTION: Packet Processor
10-16 21:56:59.865: E/AndroidRuntime(14559): java.lang.RuntimeException: Canvas: trying to use a recycled bitmap android.graphics.Bitmap@429611d0
10-16 21:56:59.865: E/AndroidRuntime(14559):    at android.graphics.Canvas.throwIfRecycled(Canvas.java:1026)
10-16 21:56:59.865: E/AndroidRuntime(14559):    at android.graphics.Canvas.drawBitmap(Canvas.java:1096)
10-16 21:56:59.865: E/AndroidRuntime(14559):    at android.graphics.Bitmap.createBitmap(Bitmap.java:604)
10-16 21:56:59.865: E/AndroidRuntime(14559):    at android.graphics.Bitmap.createScaledBitmap(Bitmap.java:466)
10-16 21:56:59.865: E/AndroidRuntime(14559):    at com.google.android.gsf.gtalkservice.service.StatusBarNotifier.getAvatarForContact(StatusBarNotifier.java:726)
10-16 21:56:59.865: E/AndroidRuntime(14559):    at com.google.android.gsf.gtalkservice.service.StatusBarNotifier$NotificationInfo$Item.<init>(StatusBarNotifier.java:105)
10-16 21:56:59.865: E/AndroidRuntime(14559):    at com.google.android.gsf.gtalkservice.service.StatusBarNotifier$NotificationInfo.add(StatusBarNotifier.java:160)
10-16 21:56:59.865: E/AndroidRuntime(14559):    at com.google.android.gsf.gtalkservice.service.StatusBarNotifier.notify(StatusBarNotifier.java:415)
10-16 21:56:59.865: E/AndroidRuntime(14559):    at com.google.android.gsf.gtalkservice.service.StatusBarNotifier.notifyChat(StatusBarNotifier.java:314)
10-16 21:56:59.865: E/AndroidRuntime(14559):    at com.google.android.gsf.gtalkservice.gtalk.ChatSession.notifyChat(ChatSession.java:2237)
10-16 21:56:59.865: E/AndroidRuntime(14559):    at com.google.android.gsf.gtalkservice.gtalk.ChatSession.onReceiveMessage(ChatSession.java:905)
10-16 21:56:59.865: E/AndroidRuntime(14559):    at com.google.android.gsf.gtalkservice.gtalk.ChatMgr.processIncomingMessage(ChatMgr.java:869)
10-16 21:56:59.865: E/AndroidRuntime(14559):    at com.google.android.gsf.gtalkservice.gtalk.ChatMgr.processPacket(ChatMgr.java:642)
10-16 21:56:59.865: E/AndroidRuntime(14559):    at org.jivesoftware.smack.PacketProcessor.process(PacketProcessor.java:122)
10-16 21:56:59.865: E/AndroidRuntime(14559):    at org.jivesoftware.smack.PacketProcessor.access$000(PacketProcessor.java:13)
10-16 21:56:59.865: E/AndroidRuntime(14559):    at org.jivesoftware.smack.PacketProcessor$1.run(PacketProcessor.java:45)
10-16 21:56:59.875: E/android.os.Debug(2733): !@Dumpstate > dumpstate -k -t -z -d -o /data/log/dumpstate_app_error

1 个答案:

答案 0 :(得分:1)

这是针对API Bitmap.createScaledBitmap(Bitmap sourceBitmap,int scaledWidth,int scaledHeight,boolean filter)进行了优化。

考虑这种情况:

  1. scaledWidth等于sourceBitmap的宽度
  2. scaledHeight等于sourceBitmap的高度
  3. 此API将返回与JellyBean下的sourceBitmap相同的位图对象实例,但在ICS及以下(gingerbread ......)下返回不同的位图对象实例。我已经在JellyBean和ICS下测试了这个问题。

    因此,如果您的代码在给定情况下回收返回的位图,那么sourceBitmap也将被回收。实际上也许您使用sourceBitmap在画布上绘制,但是sourceBitmap被回收,因此您的应用程序在JellyBean下崩溃。

    要解决此问题,您应该在使用API​​ Bitmap.createScaledBitmap(.....)之前使用sourceBitmap检查scaledWidth和scaledHeight参数,请参阅下面的代码:

        public Bitmap getScaledBitmap(Bitmap sourceBitmap,  int scaledWidth, int scaledHeight, boolean filter){
        Bitmap scaledBitmap = null;
    
        if (null != sourceBitmap){
            if(sourceBitmap.getWidth() == scaledWidth && sourceBitmap.getHeight() == scaledHeight){
                scaledBitmap = Bitmap.createBitmap(sourceBitmap);
            }else{
                scaledBitmap = Bitmap.createScaledBitmap(sourceBitmap, scaledWidth, scaledHeight, filter);
            }
        }
    
        return scaledBitmap;
    }