有简单的活动A和B。活动A启动活动B,我可以选择一个图像作为个人资料图像,首先将其上传到服务器,然后通过接收的URL显示该图像。首先,当我切换到活动B时,一切正常,如果已经下载了一个图像,则该图像将显示在imageview中,否则它将被下移并显示。在这种情况下,如果我选择要上传的其他图像,则其工作正常,并且imageview将显示新图像。当我退出活动并重新启动该活动时,将显示先前下垂的图像(如果存在),但是上传到服务器的任何新图像甚至都不会显示可绘制对象。在我再次退出活动并重新启动活动之前,imageview根本不会更新,在这种情况下,将显示先前上传的图像,但不会显示新图像。综上所述,第一次一切正常,但是下一次图像只能正确加载一次。 我一直在使用Glide和Frisco,并认为问题是由它们引起的,但是随后使用了简单的ImageView和简单的连接来下载位图,结果是一样的。它只能工作一次。
我已经在诺基亚6.1,Android 9和Nexus 5x Android 8.1以及带有Android 8.1和Android 9的模拟器上进行了测试。我还尝试了发布版本,并且仍然相同。此外,我使用的是AndroidX下载图像并加载它们的策略与我以前的项目相同,而且我之前从未遇到过这个问题。
在加载图像之前和之后在下面尝试了这些操作,但无法正常工作。 使用Glide和Frisco时,缓存也被禁用。网址是完全随机的,因此它们甚至没有机会缓存它们。 这是一个示例下载和加载,只是临时的。
image.setImageResource(0);
image.setImageBitmap(null);
image.invalidate();
new Thread(new Runnable() {
@Override
public void run() {
Bitmap bmp = null;
try {
trustEveryone();
URL url = new URL(user.image_address);
bmp = BitmapFactory.decodeStream(url.openConnection().getInputStream());
Bitmap finalBmp = bmp;
ProfileActivity.this.runOnUiThread(new Runnable() {
@Override
public void run() {
_profileImage.setImageBitmap(null);
_profileImage.setImageResource(0);
_profileImage.invalidate();
_profileImage.setImageBitmap(finalBmp);
}
});
} catch (IOException e) {
e.printStackTrace();
}
}
}).start();
答案 0 :(得分:0)
所以这是解决方案。活动顺序:Main-> Profile-> Gallery-> Crop->返回个人资料 要将结果从Crop返回到Profile,我使用的是必须在UI线程上运行的事件总线,因此用于runOnUI ...来发布事件的Activity是CropActivity,它在事件发布后完成,尽管我使用ProfileActivity.runOnUI ...在从事件总线接收事件时加载图像,整个代码都在CropActivity上运行,因此我使用了另一种解决方法将结果发送回先前的活动,从而解决了该问题,而无需使之无效或将图片设置为空。