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

问题描述

我正在开发一个 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 个小时的搜索,我找到了问题并进行了修复。

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

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

calendarSelectedDayRef?.current?.focus();

有用的帖子:

  1. onBitmapLoaded of Target object not called on first load
  2. https://stackoverflow.com/a/28335661/12029824