2012-03-01 24 views
0

get要求をreqularly送信してサーバーをリッスンする関数を記述したいとします。最初の要求から応答が受信されるまで、次の要求はサーバーに送信されません。これをシミュレートするために、私は5回サーバに連続したGETリクエストを送信し、次のコードを記述します。連続取得要求の送信方法

public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    //setContentView(R.layout.main); 
    TextView tv = new TextView(this); 

    for (int i = 0; i < 5; i++) 
    { 
     tv.setText(retrieve("http://www.mydomain.com/http.php?key=" + i)); 
     setContentView(tv); 
    } 
} 

「文字列検索(文字列のURL){...}」この場合は、URLの内容を返す関数であります以下のPHPファイルで送信された数だけ(「http.php」):私は私のAndroidアプリ上の値を参照するには、1秒睡眠を置くものの

<?php 
sleep(1); 
echo $_GET['key']+1; 
?> 

、私が見る唯一のものは、いくつかの秒後に「5」であります。これらの5つのリクエストはasynですか、それとも連続しているのですか、別の問題がありますか?

答えて

3

onCreateメソッド内のコードは、何かを見る前に一度だけ実行され、おそらく5(最後のもの)しか見ることができません。また、そこからネットワークコールを行うべきではないので、UIメインスレッドをしばらくブロックし、恐らくあなたのアプリを強制終了させるでしょう。

バックグラウンドで実行するメソッドを実装する必要があります。これに似た何か:

private int i; 
public void onCreate(Bundle savedInstanceState) { 
    i = 0 
    new ServerRetreiveTask().execute("http://www.mydomain.com/http.php?key=" + i); 
} 

private class ServerRetreiveTask extends AsyncTask<String, Void, Bitmap> { 
    protected Bitmap doInBackground(String urls) { 
     return retrieve(url); 
    } 

    protected void onPostExecute(Bitmap result) { 
     mImageView.setImageBitmap(result); 
     if (i<5){ 
      i++: 
      new ServerRetreiveTask().execute("http://www.mydomain.com/http.php?key=" + i); 
     } 
    } 
} 

スレッド(推奨されません)を使用して、非同期タスクについての詳細はhttp://developer.android.com/resources/articles/painless-threading.html

代替方法は、本書を読む:

new Thread(new Runnable() { 

      @Override 
      public void run() { 
       final String response; 
       for (int i = 0; i < 5; i++) 
       { 
        response = retrieve("http://www.mydomain.com/http.php?key=" + i); 
        runOnUiThread(new Runnable() { 

         @Override 
         public void run() { 

          tv.setText(response); 

         } 
        }); 
       } 

      } 
     }).start(); 
+0

をしかし、私はそれがsynchoronusになりたい、Iサーバーから最初の応答が受信されるまで、2番目の要求を送信すべきではありません(そうですか?)。したがって、このようなループはOKですか? – Mehmed

+0

私があなたに与えたオプションはお勧めです。コードを読めば、メソッドonPostExecuteを見ることができます。これは要求が完了したときに呼び出されるため、必要に応じて機能します。 スレッドを使用してループを作成することもできます: –

+0

ソリューションをありがとうございました。それはあなたが言ったように最善の方法です...私はまた、サーバーのリスニングについて考えていますか?私はこのHTTP取得が本当の解決策ではないと思う。 – Mehmed

関連する問題