Avoiding FAILED BINDER TRANSACTION error when updating lots of widget bitmaps

后端 未结 4 2110
野性不改
野性不改 2021-02-06 03:03

I am coming across an error when I am updating my RemoteViews in my AppWidget.

.. !!! FAILED BINDER TRANSACTION !!!

This is caused

相关标签:
4条回答
  • 2021-02-06 03:34

    I tried the file URI approach listed above and other places. It worked but had two disadvantages, first it took 500ms to write the file which was noticeable in my app. Second, the ImageView downscaled the image by density() (1.5 on Nexus S).

    The solution that worked better for me is to slice the image and updated each slice separately. The layout looks like

    <LinearLayout orientation=vertical ...>
        <ImageView id = slice1, ,,,>
        ...
        <ImageView id = slice4, ,,,>
    </LinearLayout>
    

    Then in the widget provider cut the bitmap into 4 slices, and update each one separately (each with its on RemoteViews and its own appWidgetManager.updateAppWidget(...). Sorry for the high level description but hopefully you get the idea.

    0 讨论(0)
  • 2021-02-06 03:37

    The best workaround I found was to use setImageURI on the ImageView objects using

    remoteViews.setUri(R.id.myImageView, "setImageURI", "file://blahblahblah.png");
    

    Here is the full discussion from Android Developers group

    0 讨论(0)
  • 2021-02-06 03:37

    The Binder transaction buffer has a limited fixed size, currently 1Mb, which is shared by all transactions in progress for the process. Consequently this exception can be thrown when there are many transactions in progress even when most of the individual transactions are of moderate size.

    refer this link

    0 讨论(0)
  • 2021-02-06 03:38

    You can solve it by scaling down the image size this way:

    public static Bitmap scaleDownBitmap(Bitmap photo, int newHeight, Context context) {
    
    final float densityMultiplier = context.getResources().getDisplayMetrics().density;        
    
    int h= (int) (newHeight*densityMultiplier);
    int w= (int) (h * photo.getWidth()/((double) photo.getHeight()));
    
    photo=Bitmap.createScaledBitmap(photo, w, h, true);
    
    return photo;
    }
    

    Choose newHeight to be small enough (~100 for every square it should take on the screen) and use it for your widget, and your problem will be solved :)

    0 讨论(0)
提交回复
热议问题