1

私はここで何が起こる必要があるかについて頭を包むのに苦労しています。私は現在、サービスを実行するアプリに取り組んでいます。サービスを開始すると、バックグラウンドスレッドで実行されるWebサーバーが開きます。

このサービスの実行中はいつでも、ユーザーはブラウザーからデバイスにコマンドを送信できます。現在の一連のイベントは次のとおりです。

  1. ユーザーがサーバーにリクエストを送信します
  2. サーバーは、msgハンドラー構造を介してサービスにメッセージを送信し、URLパラメーターなどのデータを送信します
  3. このサービスは、データを使用して必要な処理を実行し、ブラウザーでユーザーにフィードバックメッセージを送信したいと考えています。
  4. ?????
  5. 要求に対するサーバーの応答には、サービスからのフィードバックメッセージが含まれています。

関数の設定方法では、サービスからの応答を待っている間、serve()関数を一時停止し、メッセージを受信したら再開してhttp応答を送信する必要があります。

WebServer.java

public Response serve( String uri, String method, Properties header, Properties parms, Properties files )
{

    Bundle b = Utilities.convertToBundle(parms);
    Message msg = new Message();
    msg.setData(b);
    handler.sendMessage(msg);
    //sending a message to the handler in the service

    return new NanoHTTPD.Response();
}

CommandService.java

public class CommandService extends Service {

private WebServer webserver;
public Handler handler = new Handler() {
      @Override
      public void handleMessage(Message msg) {
          execute_command(msg.getData());//some type of message should be sent back after this executes

      };

助言がありますか?この構造はそれを実現するための最良の方法ですか、それともよりクリーンな実装につながるより良い設計を考えることができますか?

4

1 に答える 1

1

答えがないのは、あなたが自分の質問が何であるかについてあまり具体的ではなかったからだと思います。私の経験では、StackOverflowに関する一般的なアーキテクチャのアドバイスよりも簡単な質問や直接的な質問への回答を得る方が簡単です。

私はAndroidの専門家ではありませんが、試してみます。私の質問は、なぜサービスのバックグラウンドでWebサービスを実行しているのか、1つのクラスだけではなく、サービスをWebサービスにするのかということです。

スレッド化、通信、スリープに関して、覚えておくべき主なことは、現在のリクエストを処理しながら、新しいリクエストを処理するためにWebサーバーが常に利用可能である必要があるということです。それ以外は、クライアントがスレッドがタスクを完了するのを待つ(つまり、スレッドが「ブロックする」)のが普通です。そのため、ほとんどのWebサーバーは、着信する各リクエストを処理するために新しいスレッドを生成します。バックグラウンドスレッドがあるが、バックグラウンドスレッドがタスクを完了するのを待つ間に最初のスレッドをブロックする場合は、すべてを完了するだけで十分です。 1つのスレッドで。実際には、簡単にするために後者の方が望ましいでしょう。

リクエストが届いたときにAndroidが実際に新しいスレッドを生成している場合は、バックグラウンドスレッドは必要ありません。1つのスレッドですべてを同期して実行し、シンプルさを楽しんでください。

于 2012-07-10T09:29:06.880 に答える