我每天都运行一个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
正在尝试访问它,我是否会遇到问题?如果是这样,我应该如何实现同步?
答案 0 :(得分:1)
如果服务当前正在将数据写入文件,并且WebView为 尝试访问它,我会遇到问题吗?
在这种情况下,您可以通过在文件名后附加一些内容并在下载完成后改回名称来将数据写入文件。例如
context.openFileOutput(fileName + ".downloading", Context.MODE_PRIVATE))
,稍后下载完成后,将文件重命名为原始fileName
。我确定您在shouldUseCache(url)
中检查文件是否存在,以便它将继续正常工作。这样可以避免在尝试读取文件时仍在下载文件的情况。