通过 Picasso 加载的 android 主屏幕小部件中的图像有时仅更新

Image in android home screen widget loaded through Picasso only updates sometimes

我正在开发一个 Android 主屏幕小部件,它从 url 的数组(从 firebase 数据库获得)中选择一个随机图像 url,并显示该图像.该小部件每 30 分钟更新一次,因此应该每 30 分钟左右显示一个新图像。

我正在使用 Picasso 显示来自 url 的图像。

RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.widget);

if (currentWidget.url.length() > 0) {
    final RoundCornersTransformation transformation = new RoundCornersTransformation(50, 0);
    Picasso.get().load(currentWidget.url).memoryPolicy(MemoryPolicy.NO_CACHE).transform(transformation).into(new Target()  {
        @Override
        public void onBitmapLoaded (final Bitmap bitmap, Picasso.LoadedFrom from){
            Log.d("PICASSO", "Bitmap Loaded");
            views.setImageViewBitmap(R.id.appwidget_image, bitmap);
        }

        @Override
        public void onBitmapFailed(Exception e, Drawable errorDrawable) {
            Log.d("PICASSO", "Bitmap Failed");
        }

        @Override
        public void onPrepareLoad(Drawable placeHolderDrawable) {
            Log.d("PICASSO", "Bitmap Prepared");
        }
    });
}

我已经测试了url,它正在定期更新,并且代码中没有逻辑错误,因为有时会显示图像。但是,大多数时候,即使 url 更新并且我在控制台中看到“已加载位图”,小部件中的图像也不会更新。

好的,经过 10 小时的搜索,我找到了问题并进行了修复。

基本上,Picasso 持有对目标 class 的弱引用,它得到“垃圾收集”。因此,图像永远不会加载 FIRST TIME。因为我每次都选择一个随机的 URL,所以只在某些时候选择了相同的 URL,这解释了为什么它只显示图像 有时 ,而不是每次都在第一次失败后。

我通过找到删除目标的方法修复了它 class。这是固定代码:

if (currentWidget.url.length() > 0) {
    final RoundCornersTransformation transformation = new RoundCornersTransformation(50, 0);
    Picasso.get().load(currentWidget.url).transform(transformation).into(views, R.id.appwidget_image, new int[] {appWidgetId});
}

有用的帖子:

  1. onBitmapLoaded of Target object not called on first load