Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 如何判断当前是否正在写入文件?_Android_File - Fatal编程技术网

Android 如何判断当前是否正在写入文件?

Android 如何判断当前是否正在写入文件?,android,file,Android,File,我正在后台线程中保存一个相当大的位图。大约需要一秒钟。主线程将尝试将同一文件加载到画布中。如何告诉主线程等待它完成保存 编辑: 我想知道如何检查文件,而不是如何等待;对不起,误会了 由于各种原因,位图对象已从主线程的内存中删除 是否有一种标准的方法来检查文件是否正在使用,或者我是否应该使用变通方法?用于运行后台线程并在完成时更新UI。它是专门为这项任务设计的 还要注意的是,您永远不应该占用UI线程(如等待后台线程完成),因为这会阻止UI交互,并且您的UI将没有响应,或者更糟的是,您可能会得到一个

我正在后台线程中保存一个相当大的位图。大约需要一秒钟。主线程将尝试将同一文件加载到画布中。如何告诉主线程等待它完成保存

编辑:
我想知道如何检查文件,而不是如何等待;对不起,误会了

由于各种原因,位图对象已从主线程的内存中删除

是否有一种标准的方法来检查文件是否正在使用,或者我是否应该使用变通方法?

用于运行后台线程并在完成时更新UI。它是专门为这项任务设计的


还要注意的是,您永远不应该占用UI线程(如等待后台线程完成),因为这会阻止UI交互,并且您的UI将没有响应,或者更糟的是,您可能会得到一个

Android的AsyncTask将适用于此问题:

您可以在doInBackground中更新位图,然后在PostExecute上通知主线程将其绘制到画布


编辑/他所说的

这个
FileObserver
课程非常适合你的需要。它很容易使用。当观察到的文件在写入后关闭时,将调用
onEvent
回调,并将
CLOSE\u WRITE
作为参数。

这是观察文件更改的正确答案,但在此上下文中是错误的。OP有错误的UI线程处理问题。如果你告诉主线程等待后台线程完成,那么为什么要使用后台线程呢?我想知道如何检查文件,而不是如何等待;对不起,误会了。当然,我会使用带有进度对话框的异步任务,我的观点是,您不必检查文件。使用AsyncTask保存位图并在完成时更新UI。请参阅AsyncTask文档以了解如何执行。您不必手动启动线程。AsyncTask自动处理所有这些。我正在使用AsyncTask保存文件。我并不总是知道它何时完成,因为主要活动可能在异步任务完成之前结束。例如,如果用户点击后退按钮退出主活动,然后立即再次启动主活动,它将尝试在AsyncTask完成保存之前加载文件。啊,明白了。我想说的很简单——在保存文件时,只需以特定的方式命名,例如“tmp##original#u name”。然后在完成后重命名它。这样,任何代码只需查看文件名就可以知道文件正在保存到哪个位置。是的,我会使用AsyncTask检查文件。只是想知道如何检查:)嗯?你不必检查文件。只需使用AsyncTask保存文件(自动在后台线程中运行),完成后在
onPostExecute()
中更新UI。该文件应保存在
AsyncTask
中。这就解决了问题。有时主线程也会被破坏(配置已更改),所以它是这样的:1。后台线程保存。2.主线程被破坏。3.已创建主线程,并尝试加载文件。4.文件未加载,因为它尚未完成保存。