2012-03-01 30 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