Android小部件:如果getViewAt()方法执行时间过长,则RemoteViewsFactory无法正确显示项目

时间:2016-04-15 18:31:14

标签: android android-widget android-appwidget

我有一个Android小部件,在GridView中显示用户缩略图。该代码遵循android示例代码,用于实现显示集合的小部件。以下是我的getViewAt()方法的代码:

@Override
public RemoteViews getViewAt(int position)
{
    if (mWidgetItems == null || position > mWidgetItems.size() - 1)
    {
        return getLoadingView();
    }
    WidgetUiUser user = mWidgetItems.get(position);

    RemoteViews views = new RemoteViews(mContext.getPackageName(), R.layout.widget_grid_item);

    views.setTextViewText(R.id.widgetLocation, user.getShortLocation());
    views.setViewVisibility(R.id.widgetLocation, View.VISIBLE);

    Intent srcIntent = ProfileActivity.createIntent(MyApplication.getInstance(), user, PageSourceHelper.Source.SOURCE_WIDGET);

    srcIntent.setAction(IntentRoutingActivity.getUniqueIntentAction()); //required for this activity to work properly
    views.setOnClickFillInIntent(R.id.widgetGridItemLayout, IntentRoutingActivity.createWidgetFillInIntent(srcIntent));

    // Fetch bitmap synchronously
    Bitmap bitmap = mImageFetcher.getBitmap(user.getImageUrl());
    views.setImageViewBitmap(R.id.widgetImage, bitmap);

    return views;
}

一切正常,所有网格项都能正确显示,同时快速执行同步图像加载。

但是,如果我在一个速度较慢的网络上运行应用程序,图像下载可能需要几秒钟,我很快就会看到许多网格项无法完全加载。我添加了一些logcat输出,并且可以看到适配器无法请求未加载的网格项。

因此,例如,我的小部件显示了一个3x3的用户网格,整个GridView保持80左右。正常工作时,我看到前20个网格项周围的适配器请求,并且它们都正确加载。当图像加载速度很慢时,我看到适配器请求项目0,3,5和8(例如,它变化),但没有请求任何其他项目。如果我开始滚动GridView,则会有更多项目开始被请求,但许多项目仍然无法请求。

似乎在getViewAt()中花费太多时间会以某种方式打破显示行为,尽管android documentation表示在此方法中执行长操作是正常的。有人看过这个问题或知道解决方案吗?

0 个答案:

没有答案