问题描述
我正在开发一个 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();
有用的帖子: