首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Context.openFileInput与Context.openFileOutput的同步

Context.openFileInput与Context.openFileOutput的同步
EN

Stack Overflow用户
提问于 2018-06-18 16:22:50
回答 1查看 379关注 0票数 7

我有一个每天运行的Android Service,它可以进行一些数据同步。它每天下载一次文件并通过context.openFileOutput将其缓存到磁盘。

代码语言:javascript
复制
String fileName = Uri.parse(url).getLastPathSegment();
try (FileOutputStream outputStream =
     context.openFileOutput(fileName, Context.MODE_PRIVATE)) {
   outputStream.write(bytes);
   // ...
} catch (IOException e) {
   // logging ...
}

这种情况发生在后台线程上。我还有一个UI,它包含一个WebView。如果那些缓存的资源可以通过WebView获得,那么context.openFileInput就会使用它们。

代码语言:javascript
复制
@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试图访问它,我会遇到问题吗?如果是的话,我应该如何实现同步?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-06-28 04:24:22

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

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

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

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50913738

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档