0

私の Android アプリには、2 つのブロードキャスト レシーバーによって起動される 3 つのサービスがあります。最初の 2 つはファイルに書き込み、1 つのブロードキャスト レシーバーによって起動されるため、( 経由で) 1 つずつ実行されることを確認できますContext.sendOrderedBroadcast()。3 番目のものは独立しており、別のブロードキャスト レシーバーによって起動されますが、最初の 2 つが書き込みを行ったのと同じファイルから読み取ります。

ブロードキャスト レシーバーは互いに同時にまたはほぼ同時に起動される可能性があるため、ファイルも同時にアクセスされる可能性があります。どうすればそれを防ぐことができますか?最初に読んでから書くか、書いてから読むことができるようにしたい。Android サービスは、私の間違いでなければ、まったく別の獣であるため、この問題が一般的な Java の同時実行性に似ているかどうかはわかりません。

4

3 に答える 3

0

まず第一に、Services の場合のようにメイン UI スレッドでファイル I/O を行うべきではありませんでした。のように、別のスレッドで実行する必要がありますAsyncTask

第二に、このReentrantLock方法は非常に簡単です。ロックされると、同じリソースにアクセスする他のスレッドに待機するように指示し、ロックが解除された場合にのみ続行します。をインスタンス化し、new ReentrantLock()そのロックをファイルの読み取りまたは書き込みを行うメソッド間で共有するだけです。必要に応じて電話をかけるだけlock()で簡単に使用できます。unlock()ReentrantLock

于 2012-10-12T03:47:09.203 に答える
0

1 つの解決策は、書き込みタスク.lockで共有ファイルにアクセスする前に空の一時ファイル (たとえば ) を作成し、完了したら同じ一時ファイルを削除することです。

読み取りタスクは、.lockファイルが存在するかどうかを確認できます。

または、 FileLockを使用できます。

于 2012-09-17T07:11:13.013 に答える
0

http://developer.android.com/reference/android/app/Service.html サービスは、他のアプリケーション オブジェクトと同様に、ホスティング プロセスのメイン スレッドで実行されることに注意してください。これは、サービスが CPU 集中型 (MP3 再生など) またはブロック (ネットワークなど) 操作を行う場合、その作業を行う独自のスレッドを生成する必要があることを意味します。

別のスレッドでファイルの読み取り/書き込みを行うことをお勧めします。一度に使用できるスレッドは 1 つだけです。同じスレッドでそれを行うため。

于 2012-09-17T07:11:33.527 に答える