Context.openFileInput和Context.openFileOutput之间的同步

时间:2018-06-18 16:22:51

标签: java android caching synchronization android-webview

我每天都运行一个Android 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实现并确保文件读写是安全的,还是我必须自己处理同步? 例如。如果Service当前正在将数据写入文件而WebView正在尝试访问它,我是否会遇到问题?如果是这样,我应该如何实现同步?

1 个答案:

答案 0 :(得分:1)

  

如果服务当前正在将数据写入文件,并且WebView为   尝试访问它,我会遇到问题吗?

在这种情况下,您可以通过在文件名后附加一些内容并在下载完成后改回名称来将数据写入文件。例如

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

,稍后下载完成后,将文件重命名为原始fileName。我确定您在shouldUseCache(url)中检查文件是否存在,以便它将继续正常工作。这样可以避免在尝试读取文件时仍在下载文件的情况。