桌面小组件AppWidget - RemoteViews for widget update exceeds maximum bitmap memory usage

Posted 胖虎

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了桌面小组件AppWidget - RemoteViews for widget update exceeds maximum bitmap memory usage相关的知识,希望对你有一定的参考价值。

java.lang.IllegalArgumentException: RemoteViews for widget update exceeds maximum bitmap memory usage (used: 16482436, max: 15552000)
	at android.os.Parcel.createException(Parcel.java:2092)
	at android.os.Parcel.readException(Parcel.java:2056)
	at android.os.Parcel.readException(Parcel.java:2004)
	at com.android.internal.appwidget.IAppWidgetService$Stub$Proxy.updateAppWidgetProvider(IAppWidgetService.java:1175)
	at android.appwidget.AppWidgetManager.updateAppWidget(AppWidgetManager.java:771)
	at com.msxxxing.xxxxxx.updateWidget(WidgetUtil.kt:36)
	at com.msxxxing.xxxxxx.run(WidgetUpdateThread.kt:120)
Caused by: android.os.RemoteException: Remote stack trace:
	at com.android.server.appwidget.AppWidgetServiceImpl.updateAppWidgetInstanceLocked(AppWidgetServiceImpl.java:2413)
	at com.android.server.appwidget.AppWidgetServiceImpl.updateAppWidgetProvider(AppWidgetServiceImpl.java:2040)
	at com.android.internal.appwidget.IAppWidgetService$Stub.onTransact(IAppWidgetService.java:535)
	at android.os.Binder.execTransactInternal(Binder.java:1056)
	at android.os.Binder.execTransact(Binder.java:1029)

issue:
RemoteViews for widget update exceeds maximum bitmap memory usage (used: 16482436, max: 15552000)

root casue:
由于remoteviews是跨进程的传输,并不是传统意义上的view,因此当你ImageView去setImageBitmap的时候,需要注意你设置进去的bitmap是否超过了大小限制。

最大的Size公式为:
The total Bitmap memory used by the RemoteViews object cannot exceed that required to fill the screen 1.5 times, ie. (screen width x screen height x 4 x 1.5) bytes.

void computeMaximumWidgetBitmapMemory() 
        WindowManager wm = (WindowManager) mContext.getSystemService(Context.WINDOW_SERVICE);
        Display display = wm.getDefaultDisplay();
        Point size = new Point();
        display.getRealSize(size);
        // Cap memory usage at 1.5 times the size of the display
        // 1.5 * 4 bytes/pixel * w * h ==> 6 * w * h
        mMaxWidgetBitmapMemory = 6 * size.x * size.y;
    

系统内部AppWidgetServiceImpl.java中会去评估你给Remoteviews设置的view的大小,来看是否给你抛一个异常

if (views != null) 
            bitmapMemoryUsage = views.estimateMemoryUsage();
        
        if (bitmapMemoryUsage > mMaxWidgetBitmapMemory) 
            throw new IllegalArgumentException("RemoteViews for widget update exceeds maximum" +
                    " bitmap memory usage (used: " + bitmapMemoryUsage + ", max: " +
                    mMaxWidgetBitmapMemory + ") The total memory cannot exceed that required to" +
                    " fill the device's screen once.");
        

Solution:

Bitmap要压缩再使用

以上是关于桌面小组件AppWidget - RemoteViews for widget update exceeds maximum bitmap memory usage的主要内容,如果未能解决你的问题,请参考以下文章

桌面小组件AppWidget - RemoteViews for widget update exceeds maximum bitmap memory usage

桌面小组件AppWidget - RemoteViews for widget update exceeds maximum bitmap memory usage

uniapp 窗口小工具桌面小部件微件 Ba-AppWidget

uniapp 窗口小工具桌面小部件微件 Ba-AppWidget

Android桌面小部件AppWidget开发

AppWidget(桌面小部件)