私は、バックグラウンドで実行されているサービスとそのサービスに接続されているアクティビティからなるAndoid Appを開発しています。サービスは独自のプロセスで実行されます。ConcurrentLinkedQueueは期待通りに動作しません
私のサービスは主にServiceMain、ServiceWorker、Messageという3つのクラスを持っています。
ServiceMainには、logIn、logOut、send ...などのアクティビティで使用されるすべての機能があります。
メッセージは、当社のサーバーに送信されたメッセージまたは受信されたメッセージを表します。単純にStringとbool(Stringはメッセージ)、boolはサーバーからの応答が必要かどうかを示すフラグです。
ServiceWorkerはThreadのサブクラスであり、すべての送信はソケットを使用してメッセージを受信します。 loginメソッドが作成されServiceWorkerと呼ばれ、開始された場合
Queue<Message> Sendingqueue= new ConcurrentLinkedQueue<Message>();
Queue<Message> Recievequeue = new ConcurrentLinkedQueue<Message>();
:
ServiceMainは2つのキューが含まれています。コンストラクタでは、両方のキューへの参照を取得し、それらを保持します。
private final Queue<Message> Sendingqueue;
private final Queue<Message> Recievequeue;
ServiceMainはいくつかのメッセージ(たとえばM1、M2)を作成し、それらをSendingqueueに追加します。
ServiceWorkerは、当社のサーバーへの接続を構築し、それがSendingqueue内のメッセージを探しループに走る、それらを送信し、recievingのようないくつかのパーソナルプラグインのものをやって....
は、シナリオが今明らかであると思います。奇妙なServiceWorker何か以内
はSendingqueueに起こる:
はのはServiceWorkerがかかり、何かの時間をやっているか、弊社のサーバーに接続されていない間、ServiceMainはSendingqueueに二つのメッセージ、M1とM2を追加したとしましょう。 送信キューに2つのメッセージが含まれるようになりました。
次回ServiceWorkerがキューの長さを取得すると、2つの項目が表示されます。これまでのところOk。 その後、Sendingqueueでpeek()(メッセージは正常に送信された場合にのみ削除されます)とはが最初に追加されたために取得する必要があります。 しかし、それはM2を取得します。 Sendingqueueが元に戻ったようです。
ここで何が問題になりますか?これを避けるために私は何ができますか?
建設的な返信をありがとう。
デトレフ
[sscce](http://sscce.org/)は、散文のみから間違っていることを確認するのが難しいため、提供してください。あなたは尻尾に追加して、頭から覗くこと、またはその逆をしていると確信していますか? – BeeOnRope
私はこれを再現するための例を作りようとします。 –