内存中的图像更新不会反映在本机图像组件中

I.D*_*yan 5 java android react-native

我正在使用 react native 制作一个 android 应用程序。该应用程序使用 java/native 代码进行图像处理。

该应用程序有一个图像组件,单击它会调用一个 java 函数,该函数创建一个图像并将其保存到内部存储中,并将 URI 返回给它。(结果图像可能会有所不同)

示例代码是:

FileOutputStream out = null;
try {
    out = new FileOutputStream(imgPath);
    resultMap.compress(Bitmap.CompressFormat.JPEG, 100, out);
} catch (Exception e) {
    finishCallback.invoke(false);
    Toast.makeText(getReactApplicationContext(), e.getMessage(), Toast.LENGTH_LONG).show();
    e.printStackTrace();
    return;
} finally {
    try {
        out.close();
    } catch (IOException e) {
        finishCallback.invoke(false);
        Toast.makeText(getReactApplicationContext(), e.getMessage(), Toast.LENGTH_LONG).show();
        e.printStackTrace();
        return;
    }
}

finishCallback.invoke(true,imgPath.toURI().toString());
Run Code Online (Sandbox Code Playgroud)

接收方应更新图像组件以显示保存的图像。

当我第一次运行它时,它工作正常,但是当我再次运行它时,即使存储中的图像已更改,组件也不会更新。

为了更新视图,我需要关闭应用程序并重新启动它,告诉它显示存储中保存的内容,然后显示更改。

  • 尽管我已经检查并确保删除了旧图像并且有一个新图像,但只有在之前已经使用过返回 URI 时才会发生这种情况。

接收方看起来像这样:

(JniActivity.fillDoor是负责更新storage中图片的java函数)

  onSelectFillImage = (source) => {
  JniActivity.fillDoor(
  this.state.doorImageSource.uri,
  source.uri,
  (isDone, picURI) => {
    Alert.alert("is done: " + isDone);
    if (isDone) {

      const fixed = picURI

      const source1 = { uri: fixed };

      this.setState({
        filledDoorImageSource: source1
      });
    }
  }
);
Run Code Online (Sandbox Code Playgroud)

感谢您的任何帮助!

I.D*_*yan 2

研究完这个问题后发现问题是组件缓存了图像。

只要您使用相同的 URI,组件就不会转向服务器来更新图像,而是使用缓存的信息。

尽管根据我的理解,有一些方法可以告诉组件不缓存图像,但无法 100% 保证组件不会缓存,尽管您尽了最大努力。

最快的解决方案是向图像名称添加一个大的随机数,这将确保 URI 永远不会重复(当然同时确保删除所有以前不再需要的数据)。

示例代码:

String ImageName += Integer.toString(Math.round(Math.random()*1000000000);
Run Code Online (Sandbox Code Playgroud)