重新打开 activity 后,ImageView 未更新为新的 URL

ImageView not Updating with new URL after activity is reopened

有简单的活动 A 和 B。Activity A 启动 Activity B,我可以 select 一张图片作为个人资料图片,首先我会将其上传到服务器,然后然后通过收到的 url 显示图像。起初,当我切换到 activity B 时,一切正常,如果已经下载了图像,它会显示在图像视图中,或者将被下载并显示。在这种情况下,如果我 select 其他图像上传,它工作正常,图像视图将显示新图像。当我退出 activity 并重新启动它时,会显示之前下载的图像(如果存在),但上传到服务器的任何新图像都不会显示,甚至连可绘制对象也不会显示。在我再次退出 activity 并重新启动它之前,图像视图根本不会更新,在这种情况下,将显示之前上传的图像,但不会再显示新图像。总而言之,第一次一切正常,但下一次图像只正确加载一次。 我一直在使用 Glide 和 Frisco,并认为问题是由它们引起的,但后来使用简单的 ImageView 和简单的连接来下载位图,结果是一样的。它只工作一次。

我一直在诺基亚 6.1 plus Android 9 和 Nexus 5x Android 8.1 以及带有 Android 8.1 和 Android 9 的模拟器上进行测试。我已经还尝试了发布版本和 same.In 添加,我正在使用 AndroidX 并且下载图像和加载它们的策略与我以前的项目相同,我以前从未遇到过这个问题.

在加载图像之前和之后尝试了以下这些方法,但没有用。 使用 Glide 和 Frisco,缓存也被禁用。 url 是完全随机的,所以他们甚至没有机会缓存​​它们。 这是一个示例下载和加载,它只是临时的。

 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();
  • 在使用以下方法之前,在迁移到 androidX 之前在我的备份项目上对其进行了测试,结果是一样的,所以问题不是因为 androidX

所以这是解决方案。活动顺序:Main->Profile->Gallery->Crop->Back to Profile return 从 Crop 到 Profile 的结果我正在使用事件总线,它必须在 UI 线程上 运行,所以 Activity 用于 运行On UI... 到 post 事件是 CropActivity,在事件 posted 之后完成,虽然我使用 ProfileActivity.runOnUI ...从事件总线接收事件时加载图像,整个代码在 CropActivity 上 运行 所以我使用另一种解决方法将结果发送回之前的 activity 并且解决了这个问题没有需要使图像无效或将图像设置为空。