2

设置小部件时,我必须createView()从主线程调用该方法,否则小部件将显示“无法加载小部件”并获取错误视图。

但是当用户安装了许多小部件时,加载我的启动器可能需要几秒钟。(每个最多 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();
    }
}

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

4

1 回答 1

1

当我需要在从列表视图的 getview 启动的异步任务中创建小部件时,这就是我所做的:

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

}

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

此外,我不知道您正在制作什么类型的主屏幕,但请确保您创建的小部件不会超过一次在屏幕上可以看到的小部件 + 例如左侧或右侧的页面。

于 2014-06-10T17:01:58.093 回答