2012-01-27 11 views
4

これを実装する最良の方法は何でしょうか。私はラウンドで2台の電話機間の通信を許可するために私のpythonサーバーを使用するAndroidアプリを持っています。ラウンドは、ラウンドが始まるまでお互いに話すことができないことを意味し、他の人が応答するまで別のラウンドを送信できないメッセージを送信すると、新しいラウンドを開始します。IntentService、Service、またはAsyncTask

私はIntentServiceを使用すると思っていましたが、サーバを常に起動して停止させるのは間違っていて、asynctaskの問題を心配する必要はありません。それを処理する最善の方法です。サービスを受け取り、クライアントにメッセージを送信するにはどうすればよいでしょうか?

答えて

2

私の知る限り、問題はワーカーキューモデルのプロデューサー - コンシューマーモデルです。インテントサービスはそれを行うためのものです。マルチスレッドを行う必要がある場合にのみ、サービスを使用する必要があります。 IBinderインターフェイスを使用して、アクティビティとサービスと通信できます。

Asynctaskは特殊なスレッドにすぎず、UIを簡単に更新できます。しかし、あなたのケースではIntentServiceが最善の選択肢のようです。

+0

あなたは間違っています: *サービスは、他のアプリケーションオブジェクトと同様に、ホスティングプロセスのメインスレッドで実行されます。これは、あなたのサービスがCPUを集中的に(例えばMP3再生)やブロックする(ネットワーキングのような)操作を行う場合、その作業を行う独自のスレッドを生成するはずであることを意味します。 *サービスはスレッドではありません。これは、(アプリケーションが応答しないというエラーを避けるために)メインスレッドの処理を行う手段ではありません。 マルチスレッドが必要な場合には、そうでない場合に限ります。 – roiberg

+1

IntentServiceは、メインスレッドである@roibergの処理を処理するために、フードの下でAsyncTaskを使用します。 – lilbyrdie

+0

@roiberg正しい。サービスはメインスレッド上で動作します。この回答をより明確にするために、サービスはマルチスレッド(スレッドプール)またはバックグラウンドで非常に長い時間シリアル化されたexecutor/handlerスレッドを保持するのに便利です。 – manjusg

5

IntentService/Broadcast Receiverルートを強くお勧めします。 AsyncTaskに関連した厄介な構成変更の問題を回避することで、10倍も簡単になります。

+0

メッセージが表示される標準スレッドは表示されません。アクティビティは、コンフィグレーションの変更後であってもバックグラウンドスレッドからメッセージを受け取りますか? – Yar

+1

スレッドは元のコンテキストへの参照を保持します。設定変更後にコンテキスト/ハンドラを再登録すると、これを回避することができますが、Receiverルートはまだ簡単です。 – SeanPONeil

0

アラームは、AlarmManagerでスケジュールされていますので、ラウンドが開始/終了したかどうかをチェックするように設定できます。それはサービスの利点を持っていますが、バッテリーの消耗の恐怖はありません。アラームの実行頻度(時間の列挙型(1時間/日/週など)も含む)には頻度が必要です。

アラームが実行されると、ポーリングして現在の状態を確認し、それに応じて反応します。たとえば、通知がステータスバーに入ると、電話が耳に鳴り、振動する可能性があります。この利点は、アラームがブロードキャスト受信機をトリガーするため、ユーザーがアプリを実行し続ける必要がないことです。

アラームコードの例:http://www.androidcompetencycenter.com/2009/02/android-basics-alarm-service/

17

テントのサービスが何よりの意図によってトリガーされるワーカースレッドは、別のスレッドでそのアクションを実行して、シャットダウンを取得されません。それらは開始および停止するように設計されています。

http getのようなものを実行する必要がある場合や、サーバーとの接続を維持する必要がない場合は、インテントサービスを使用して、ブロードキャストイベントを使用してアクティビティを通知します。

あなたのアプリがサーバ(すなわち永久的なtcp接続)に接続している必要がある場合、私は、asynctaskを使ってネットワークの処理を行うサービス(インテントではない)サービスでホストされている古典的なスレッド。次に、bindToService()を使用して、アクティビティをサービスと対話させることができます。

アクティビティ内でasynctasksを使用しないことをお勧めします。自分の返信に記されているように、水平/垂直ビューの変更の場合にサーバーの応答を失う危険があります。

+0

そして、フラグメントを使ってローテーションの問題を解決するには、https://gist.githubで確認してください。com/daichan4649/2480065 – MSaudi

+0

AsyncTaskを使用すると、画面の電源を切ってもサーバー接続が失われます。 – albertTaberner

関連する問題