如何发送连续的get请求

时间:2012-03-01 13:35:19

标签: android http-get

我想编写一个通过发送get请求来侦听服务器的函数。在收到第一个请求的响应之前,不应将下一个请求发送到服务器。为了模拟这一点,我编写了以下代码,将连续的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);
    }
}

“String retrieve(String url){...}”是返回url内容的函数,在本例中只是由以下PHP文件(“http.php”)发送的数字:

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

虽然我在我的Android应用程序上看了1秒钟的睡眠值,但我看到的唯一的事情是在几秒钟之后是“5”。那么这5个请求是asyn还是它们是连续的还是有其他问题?

1 个答案:

答案 0 :(得分: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();