0

我的 Android 应用程序中有三个服务由两个广播接收器触发。前两个写入文件并由一个广播接收器触发,因此我可以确保它们一个接一个地执行(通过Context.sendOrderedBroadcast())。第三个是独立的,由一个单独的广播接收器触发,但从前两个写入的同一个文件中读取。

因为广播接收器可能同时或几乎同时被触发,所以文件也可能被同时访问。我怎样才能防止这种情况发生?我希望能够先读后写或先写后读。我只是不确定这个问题是否与一般的 Java 并发相似,因为如果我没记错的话,android 服务是一个完全不同的野兽。

4

3 回答 3

0

一种解决方案是让您的写作任务.lock在访问共享文件之前创建一个空的临时文件(例如),并在完成后删除相同的临时文件。

您的阅读任务可以检查.lock文件是否存在。

或者,您可以使用FileLock

于 2012-09-17T07:11:13.013 回答
0

http://developer.android.com/reference/android/app/Service.html 请注意,服务与其他应用程序对象一样,在其托管进程的主线程中运行。这意味着,如果您的服务要执行任何 CPU 密集型(例如 MP3 播放)或阻塞(例如网络)操作,它应该生成自己的线程来完成这项工作。

我建议在单独的线程中读取/写入文件。您一次只能使用一个线程!在同一个线程中执行此操作。

于 2012-09-17T07:11:33.527 回答
0

首先,我不应该在主 UI 线程中完成文件 I/O,而Services 就是这种情况。它应该在另一个线程中完成,例如AsyncTask.

其次,ReentrantLock方法要简单得多。当被锁定时,它告诉访问相同资源的其他线程等待,并且只有在锁被释放时才继续。只需实例化 anew ReentrantLock()并在读取或写入文件的方法之间共享该锁。它就像打电话一样简单,只要lock()你需要它。unlock()ReentrantLock

于 2012-10-12T03:47:09.203 回答