【问题标题】:App Widget Update Headaches: Failed Binder Transaction, RemoteViews, setImageURI, and orientation changesApp Widget 更新头疼:Binder Transaction、RemoteViews、setImageURI 和方向更改失败
【发布时间】:2013-02-12 02:12:29
【问题描述】:

我在更新 AppWidgets 时遇到问题,并且 android 中的限制/错误的汇合使我无法找到解决方法。

我的应用小部件是可主题化的,因此我需要能够在运行时更新其上的图像视图(以及文本视图和意图)。我正在更新多达 9 个图像视图,但我使用的图形大小相当适中(最大 11kb png)。我通过 RemoteViews 对象推送的数据总大小应该在 100kb 以下,完全在 1mb 的限制之内。我认为屏幕上的实际可绘制资源最终会比原始 png 更大,但 10% 的限制似乎足以解释这一点。但是,对于某些手机和启动器,我会收到“FAILED BINDER TRANSACTION”错误。

我为此找到了两种解决方案:

1) 使用 setImageViewUri(调用 setImageURI)而不是 setImageViewResource 与 RemoteViews 对象,这摆脱了通过 RemoteViews 对象发送可绘制对象,而是从 URI 加载图像。解决内存错误(见https://groups.google.com/forum/#!topic/android-developers/KKEyW6XdDvg/discussion

2) 将应用小部件的更新分成多个 RemoteViews 调用。所以我更新了 3 张图片,调用 updateAppWidget,创建一个新的 RemoteViews 对象,更新接下来的 3 张图片,调用 updateAppWidget 等等。

第一种方法的问题在于它只适用于中等密度的设备。由于 android 代码库中的错误,所有其他设备无法正确缩放图像(请参阅错误报告:http://code.google.com/p/android/issues/detail?id=22590

第二种方法的问题在于,当屏幕方向发生变化时,android 会使用它存储在某个秘密位置的最后一个 RemoteViews 调用来销毁并重新创建小部件视图。这意味着 appwidget 没有完全重绘,因为我拆分了 RemoteView 调用并且小部件最终无法使用。似乎没有可靠的方法来确定 android 何时销毁和重新创建应用程序小部件 - 服务中的 onConfigurationChanged 并不总是触发,也没有进行任何活动级别的调用(即我可以找到的 onUpdate、onReceive)。为了使小部件能够在方向更改时完全正确地重绘,我只能使用一个 RemoteViews (updateAppWidget) 调用,因此此解决方案将不起作用。

有人知道如何解决这个问题吗?我想知道是否可以实现我自己的 RemoteViews,它调用了一个非错误的 setImageURI 函数(在自定义 ImageView 类中),以便正确进行缩放。似乎很多工作只是更新了一些小部件,我不确定 android 是否会让我以这种方式扩展 RemoteViews/ImageView。

有没有办法在屏幕方向改变时拦截android并强制它重绘整个小部件?

很想听听任何其他建议或解决方法的想法!谢谢。

【问题讨论】:

    标签: android orientation screen-orientation android-appwidget remoteview


    【解决方案1】:

    我在开发集合的 AppWidget 时遇到了同样的问题。很多时候会发生以下情况:

    • 在旋转时,ListView 完全消失了;
    • 按钮监听器(实际称为PendingIntents)停止响应;
    • 通过setImageViewResource 更改的图片未更新;

    .. 等等。我得出了与您相同的结论:android 使用它存储在某个秘密位置的最后一个 RemoteViews 调用销毁并重新创建小部件视图。在承认这一点之后,这是一个微调AppWidgetManager.getInstance(context).updateAppWidget()的调用的问题,因为我想在告诉ListView刷新之后禁用clickListeners(或PendingIntents) (这是调用 Web 服务并检索大量数据的网络操作)并且希望在 ListView 完成加载后启用侦听器,同时保持 RemoteViews 完全加载以处理旋转。

    我差点放弃并使用它作为替代品..

    有没有办法在屏幕方向改变时拦截android并强制它重绘整个小部件?

    .. 一种确实拦截 Android 旋转变化的服务,与 AppWidget 不同。如果您的选项不多了,我建议您尝试一下:

    public class MyWidget extends AppWidgetProvider {
    @Override
        public void onConfigurationChanged(Configuration newConfig)
        {
                    // insert code here
        }
    }
    

    了解更多关于here in StackOverflow服务的信息。

    【讨论】:

      猜你喜欢
      • 2015-09-16
      • 1970-01-01
      • 2018-04-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-07-04
      • 1970-01-01
      • 2018-07-13
      相关资源
      最近更新 更多