0

Java でピザのステータス表示を実装しようとしています。したがって、Java ファイルは html ファイルの値を読み取り、それを出力します。ステータスは、php スクリプトで変更できます: http://easternmotormall.com/teamdroidco/server/statusUpdater.php

したがって、スクリプトはステータスをファイルに書き込みます: http://easternmotormall.com/teamdroidco/server/home.html

そしてJavaファイルはそれを印刷します。しかし、私の主な問題は、結果を一度だけ表示する必要があることであり、これをどのように実装できるかわかりません。

Java コードは次のとおりです。

                url = new URL("http://easternmotormall.com/teamdroidco/server/home.html");


               try {
                   System.out.println("Fetching status from the server, please wait..");
                   String temp = null;
                   while(true){
                     URLConnection con = url.openConnection();
                     BufferedReader dataPtr = new BufferedReader(new InputStreamReader(con.getInputStream()));
                     // Printing status from Status Updater
                     String status = dataPtr.readLine();
                     if (status != null) {
                         System.out.println(status);
                    }

                     dataPtr.close();
                     Scanner in2 = new Scanner(System.in);
                     in2.nextLine();
                   }
               }
               catch (IOException e) {
                 System.err.println();
               }


        }
    catch (MalformedURLException  e)
        {
            System.err.println();
        }

ループが継続しないように、最後にループを一時停止しました。

ファイルに新しいステータスが与えられたときにのみ印刷されるようにするにはどうすればよいですか?

PS。これが役立つ場合、最終的には Android アプリに変換されます。

編集:::::::::::::::::::::::::::::::::::::::::::: ここで編集スレッドのあるバージョン:

            url = new URL("http://easternmotormall.com/teamdroidco/server/home.html");


               try {
                   System.out.println("Fetching status from the server, please wait..");
                   String temp = null;
                   while(true){
                     URLConnection con = url.openConnection();
                     BufferedReader dataPtr = new BufferedReader(new InputStreamReader(con.getInputStream()));
                     // Printing status from Status Updater
                     String status = dataPtr.readLine();
                     if (status != null) {
                         System.out.println(status);
                    }

                     dataPtr.close();
                     Scanner in2 = new Scanner(System.in);
                     in2.nextLine();
                   }
               }
               catch (IOException e) {
                 System.err.println();
               }
               statusThread statusreq = new statusThread();
               statusreq.start();
               System.out.println("After the thread...");

        }
    catch (MalformedURLException  e)
        {
            System.err.println();
        }


}




    class statusThread extends Thread {

   // 2. This is the run() method with some sample contents
   public void run() {

       String status ="", lastStatus ="";
       URL url;
       try {
       url = new URL("http://easternmotormall.com/teamdroidco/server/home.html");
           System.out.println("Fetching status from the server, please wait.. (Thread started)");
           while(true){
             URLConnection con = url.openConnection();
             BufferedReader dataPtr = new BufferedReader(new InputStreamReader(con.getInputStream()));
             // Printing status from Status Updater
             status = dataPtr.readLine();
            if (status != null && !status.equals(lastStatus)) {
                //new status!
                lastStatus = status;
                System.out.println(status);
            }
            else {
                // do nothing or log something
            }

             dataPtr.close();
             Scanner in2 = new Scanner(System.in);
             in2.nextLine();
           }
       }
       catch (IOException e) {
         System.err.println();
       }


    }
}
4

3 に答える 3

0

Javaで待機するためにスレッドを使用できます。スレッドの1つの方法は、特定の期間待機できるスリープです....

于 2012-11-23T09:12:42.803 に答える
0

サーバーが適切に実装されている場合、それが HTTP ステータスの目的です。

つまり、If-Modified-Since headerリクエストで最後のリクエストの日付を使用すると、新しいコンテンツを含む 200 ok を受け取るか、新しいコンテンツを含まない 304 not modified を受け取ります。

できれば、の値は、最後のリクエストに対するレスポンスIf-Modified-Sinceのヘッダーの値です。Last-Modified

これは、あなたが求めていることを行うための最も標準的な方法です。

編集

待機部分については、次の 4 つのオプションがあります。

  • 定義された時間間隔で定期的なポーリングを使用します。
  • ロング ポーリング システムを使用する (サーバーが応答を返すまで可能な限り長くブロックする接続)
  • 通知システムを使用する (Google C2DM またはカスタム XMPP ベースの実装)
  • 常に開いている双方向ソケットを使用する

最初のオプションはあまり最適化されていませんが、簡単です。2 番目のオプションは、しばらく前の標準であり、現在も使用されています。コメットのように解決策があります。3 番目のオプションはアーキテクチャが異なりますが、非常に効率的です。自分で処理することがたくさんあるので、4 番目のオプションはお勧めしません。

于 2012-11-23T08:33:29.287 に答える
0

AsyncTaskステータスが変更されたかどうかを30秒ごとに確認するスレッドを作成します(またはAndroidの場合は使用できます)。そうでない場合は何もせず、変更されている場合は印刷します。

次のように実装できます。

static String lastStatus = "";

// ...

// In separate Thread or AsyncTask:

if (status != null && !status.equals(lastStatus)) {
    //new status!
    lastStatus = status;
    System.out.println(status);
}
else {
    // do nothing or log something
}
于 2012-11-23T08:16:05.280 に答える