android - AppWidgetHost 在主线程上创建 View

标签 android android-appwidget

设置小部件时,我必须从主线程调用 createView() 方法,否则小部件会说“无法加载小部件”并采用错误 View 。

但是当用户安装了很多小部件时,加载我的启动器可能需要几秒钟的时间。 (每个最多 300 毫秒)。

有没有办法在主线程之外创建 AppWidgetHostView

部分代码:

AppWidgetHost lWidgetHost = new AppWidgetHost(lContext, HOST_ID);

mWidgetId = lWidgetHost.allocateAppWidgetId();

AppWidgetManager.getInstance(lContext).bindAppWidgetId(mWidgetId, info.provider);

new Handler(Looper.getMainLooper()).post(new Runnable() {
    @Override
    public void run() {
        AppWidgetHostView lHostView = lWidgetHost.createView(lContext, mWidgetId, info);

        addView(lHostView);
        lWidgetHost.startListening();
    }
}

附言。是的,我的启动器是一个系统应用程序,具有执行此操作的正确权限。

最佳答案

当我需要在从 ListView 的 getview 启动的异步任务中创建小部件时,我就是这样做的:

public class CustomHostView extends AppWidgetHostView {
boolean errorFlag = false;
@Override
protected View getErrorView() {
    errorFlag = true;
    return super.getErrorView();

}

然后在您从另一个线程调用 createview 之后,您知道是否有错误并且您需要从主线程再次调用它。根据我的经验,大约 10-20% 的小部件需要主线程。

此外,我不知道您正在制作哪种类型的主屏幕,但请确保您创建的小部件不会超过屏幕上同时显示的数量 + 左侧或右侧的页面,例如.

关于android - AppWidgetHost 在主线程上创建 View ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12861653/

相关文章:

android - 是否可以通过蓝牙从 PC 向 Android 设备发送/接收语音

java - 在 MIDI 编码中改变乐器?

java - 如何让 java db sql 有一个 'Order by lastname' ?

android - 如何获取我刚刚点击的AppWidget id?

android - 如何更改小部件中的 ProgressBar 颜色?

android - 如何从另一个 Activity 启动 Android AppWidget 的配置 Activity ?

android - ProGuard 错误找不到父类(super class)或接口(interface) org.apache.http.entity

android - 防止 Android ActionBar 滚动

android - onGetViewFactory 只为多个小部件调用一次

android - 从小部件列表中拖动时阻止小部件 onUpdate onReceive?