1

私はAndroidでマルチプレイヤーオンラインワードゲームを開発しており、次のようなサーバー側のイベントをチェックするスレッドを実装したいと思います。

  • プレーヤーがゲームに参加します。
  • プレーヤーがゲームを終了しました。
  • プレイヤーがゲームに勝ちました。
  • 等...

スレッドは、あらゆる種類のイベントをリッスンし、ユーザーに表示されている場合は、責任のあるアクティビティにイベントをディスパッチする責任があります。

言い換えると、イベントのリストがあり、各アクティビティはこれらのイベントのサブセットに登録する必要があります。

イベント:

E1-E2-E3-E4

活動:

  • E1とE2に関心のあるアクティビティ1。
  • E1、E2、E3に関心のあるアクティビティ2。
  • E3とE4に関心のあるアクティビティ3。

バックグラウンドで実行され、すべてのアクティビティにイベントをディスパッチできるスレッドを実装するための最良の設計アプローチについて質問していますか?

いくつかのアイデア:

-アプリケーションレベルでAsyncTaskを実装します。

-ブロードキャストインテントをカスタムアクションに送信します。

-サービスは、ユーザーがアプリケーションを操作していないときにバックグラウンドで実行するように作成する必要があるため、最善のアプローチではありません。

ベストプラクティスのアプローチを提案できますか?

4

1 に答える 1

1

このための良いアプローチは、AsyncTasksと組み合わせてサービスを使用することです。

サービスは、ユーザーがアプリケーションを操作していないときに役立ちますが、それだけが使用できるわけではありません。サービスは、UIを必要としないものすべての論理的なホームです。

データ駆動型アプリでは、APIアダプターレイヤーとしてサービスを使用しました。すでにインスタンス化されているかどうかや、完了後にクリーンアップ作業を行う必要があるかどうかを気にせずに、どのアクティビティからでも起動できるので便利です。フレームワークは、サービスのライフサイクルを管理し、クライアントを追跡します。

あなたの場合も似ていると思います。各アクティビティは、必要な限り、更新を使用bindServiceおよび登録できます。unbindServiceアクティビティがバインドされている限り、サービスはその機能を継続します。onBindサービスは、およびで受信したインテントを使用して更新が必要なアクティビティを追跡し、onUnbind特定のインテントを介して更新を送信できます。または、より適切には、サービスはブロードキャストインテントを起動し、アクティビティは必要なものを登録できます。

サービス内で、AsyncTasksを実行して(おそらくそれらを実行してAsyncTask.THREAD_POOL_EXECUTOR複数のスレッドを取得するように)、更新を実行します。サービス自体はUIスレッドで起動されることに注意してください。

サービスを使用するもう1つの優れた利点は、アクティビティを実行する必要がないことです。頭に浮かぶこの用途の1つは、シャットダウン後のクリーンアップです。ユーザーが終了したときにスコアや分析などを投稿する必要がある場合は、アクティビティをすばやく終了して、バックグラウンドで長時間実行されている作業を終了できるようにすることができます。

アクティビティは、を使用してサービスからこれらのより長い個々のタスクを要求でき、サービスは(または)startServiceを呼び出すまで終了しません。stopSelfstopSelfResult

start/stopとbind/unbindの組み合わせにより、サービスをクリーンに管理できます。必要なときにのみ実行され、すべてのAPIアクセスを1か所に保持できます。

編集:

これが十分なテキストの壁ではなかったかのように、私はサービスを使用する別の正当な理由を考え出しました。プロセスとスレッドに関する開発者ガイドから:

サービスを実行しているプロセスはバックグラウンドアクティビティのあるプロセスよりも上位にランク付けされているため、長時間実行操作を開始するアクティビティは、特に操作の可能性が高い場合は、単にワーカースレッドを作成するのではなく、その操作のサービスを開始するのに適している可能性があります。活動より長持ちします...

于 2012-12-05T08:13:07.557 に答える