我想编写一个通过发送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还是它们是连续的还是有其他问题?
答案 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();