0

このバグは、過去1か月間私を殺しているだけです。

デフォルトで320DPIのギャラクシーs3ランニングストックジェリービーンズROMを使用しています。320 DPIが大きすぎるように見えるので、私は常にDPIを240に変更します。過去に240DPIで問題が発生したことはありません(すべてのaosp romのトークアプリでさえ、240 DPIで正常に動作します)。ただし、ストックROMを使用すると、アラートが受信されてエラーメッセージが次のようになるたびにトークアプリがクラッシュします。

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. sourceBitmap の幅に等しい scaledWidth
  2. sourceBitmap の高さに等しい scaledHeight

この 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;
}
于 2012-11-07T09:22:36.527 に答える