2012-03-01 29 views
0

我想編寫一個函數,通過發送請求的請求來監聽服務器。在從第一個請求收到響應之前,不應將下一個請求發送到服務器。爲了模擬這一點,我寫了下面的代碼,它發送連續的GET請求,服務器5倍:如何發送連續的獲取請求

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」)發送一個數字:

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

雖然我放1秒的睡眠,看在我的Android應用價值,我唯一看到的是「5」幾秒鐘後, 。那麼這5個請求是異步的,還是它們是連續的,還是存在另一個問題?

回答

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,我意思是,第二個請求不應該被髮送,直到從服務器接收到第一個響應(我是吧?)。因此,是這樣的循環行嗎? – Mehmed 2012-03-01 14:36:15

+0

我給你的選項是推薦的選項。如果您閱讀代碼,您可以看到onPostExecute方法。這在請求完成時被調用,所以它可以按照你的想法工作。 你也可以用你的方式使用線程做一個循環: – 2012-03-01 14:47:53

+0

謝謝你的解決方案,這是你說的最好的方式...我也想知道你有關收聽服務器的想法嗎?我認爲這個http get不是一個真正的解決方案。 – Mehmed 2012-03-01 16:30:04