代码之家  ›  专栏  ›  技术社区  ›  Gennadii Saprykin

context.openfileinput和context.openfileoutput之间的同步

  •  7
  • Gennadii Saprykin  · 技术社区  · 6 年前

    我有一个机器人 Service 每天运行,进行一些数据同步。它每天下载一个文件并通过 context.openFileOutput :

    String fileName = Uri.parse(url).getLastPathSegment();
    try (FileOutputStream outputStream =
         context.openFileOutput(fileName, Context.MODE_PRIVATE)) {
       outputStream.write(bytes);
       // ...
    } catch (IOException e) {
       // logging ...
    }
    

    这发生在 背景 线程。 我还有一个包含 WebView . 这个 WebVIEW 如果可以通过 context.openFileInput :

    @Override
    public WebResourceResponse shouldInterceptRequest(
        WebView view, WebResourceRequest request) {
      String url = request.getUrl().toString();
      if (shouldUseCache(url)) {
         try {
            return new WebResourceResponse(
                 "video/webm",
                 Charsets.UTF_8.name(),
                 context.openFileInput(obtainFileName(url)));
         } catch (IOException e) {
           // If a cached resource fails to load, just let the WebView load it the normal way.
           // logging ...
         }
      }
      return super.shouldInterceptRequest(view, request);
    }
    

    这事发生在 另一个背景 线程独立于服务。

    我能依靠吗 Context 实现并确保文件读写是安全的,还是必须自己处理同步? 例如如果 服务 当前正在将数据写入文件,并且 WebVIEW 正在尝试访问它,我会遇到问题吗?如果是,我应该如何实现同步?

    1 回复  |  直到 6 年前
        1
  •  1
  •   M-Wajeeh Steve Bergamini    6 年前

    如果服务当前正在将数据写入文件,而webview是 试图访问它,我会遇到问题吗?

    在这种情况下,您可以将数据写入文件,方法是在文件名后附加一些内容,并在下载完成后更改其名称。例如

    context.openFileOutput(fileName + ".downloading", Context.MODE_PRIVATE))

    下载完成后,将文件重命名为原始文件 fileName . 我确信你检查了 shouldUseCache(url) 所以它会继续正常工作。这将避免在您尝试读取文件时仍在下载文件的情况。