0

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

我正在使用galaxy s3 running stock jelly bean rom,默认情况下具有320 DPI。我总是将我的 DPI 更改为 240,因为 320 DPI 看起来太大了。过去我在使用 240 DPI 时从来没有遇到过任何问题。(即使所有 aosp rom 的谈话应用程序在 240 DPI 时都运行良好)。但是对于 stock roms,只要收到警报,talk 应用程序就会崩溃,并且错误消息是:

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
4

1 回答 1

1

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

考虑这种情况:

  1. scaledWidth 等于 sourceBitmap 的宽度
  2. scaledHeight 等于 sourceBitmap 的高度

此 API 将返回与 JellyBean 下的 sourceBitmap 相同的位图对象实例,但在 ICS 及以下(姜饼......)下返回不同的位图对象实例。我已经在 J​​ellyBean 和 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;
}
于 2012-11-07T09:22:36.527 回答