Android 为什么在执行无响应HTTP Post时线程池会被填满?
我正在使用安卓Android 为什么在执行无响应HTTP Post时线程池会被填满?,android,multithreading,http,Android,Multithreading,Http,我正在使用安卓AsyncTask每秒向服务器发布一些简单数据。服务器没有返回任何内容。但是,在进行此活动后不久,我就开始看到线程池错误。我很快意识到,由于某些原因,线程正在创建,但从未被销毁。然后,我在每一篇文章中都从服务器返回了一个简单的响应,现在它工作得非常完美。为什么会发生这种情况 public class doPost extends AsyncTask { @Override protected Object doInBackground(Object
AsyncTask
每秒向服务器发布一些简单数据。服务器没有返回任何内容。但是,在进行此活动后不久,我就开始看到线程池错误。我很快意识到,由于某些原因,线程正在创建,但从未被销毁。然后,我在每一篇文章中都从服务器返回了一个简单的响应,现在它工作得非常完美。为什么会发生这种情况
public class doPost extends AsyncTask {
@Override
protected Object doInBackground(Object[] objects) {
double lat = (Double) objects[0];
double longit = (Double) objects[1];
HttpClient httpclient = new DefaultHttpClient();
// HttpPost httppost = new HttpPost("http://192.168.1.110:3000/coord");
HttpPost httppost = new HttpPost(POSTURL);
try {
// Add your data
List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(2);
nameValuePairs.add(new BasicNameValuePair("lat", Double.toString(lat)));
nameValuePairs.add(new BasicNameValuePair("long", Double.toString(longit)));
httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
HttpResponse response = httpclient.execute(httppost);
} catch (ClientProtocolException e) {
// TODO Auto-generated catch block
} catch (IOException e) {
// TODO Auto-generated catch block
}
return null;
}
}
公共类doPost扩展异步任务{
@凌驾
受保护对象doInBackground(对象[]对象){
双lat=(双)对象[0];
双长=(双)对象[1];
HttpClient HttpClient=新的DefaultHttpClient();
//HttpPost HttpPost=新的HttpPost(“http://192.168.1.110:3000/coord");
HttpPost HttpPost=新的HttpPost(姿态);
试一试{
//添加您的数据
List nameValuePairs=新的ArrayList(2);
添加(新的BasicNameValuePair(“lat”,Double.toString(lat)));
添加(新的BasicNameValuePair(“long”,Double.toString(longit)));
setEntity(新的UrlEncodedFormEntity(nameValuePairs));
HttpResponse response=httpclient.execute(httppost);
}捕获(客户端协议例外e){
//TODO自动生成的捕捉块
}捕获(IOE异常){
//TODO自动生成的捕捉块
}
返回null;
}
}
您正在从池后台线程向http客户端进行同步调用:
HttpResponse response = httpclient.execute(httppost);
在服务器响应之前,此调用不会返回。在服务器响应之前,
doInBackground
方法甚至不会到达您的return语句。如果在return
行中添加断点,您可以很容易地看到,在服务器响应之前,返回不会被命中。我的感觉是,直到POST调用返回,任务才会完成,直到服务器响应才会返回。即使您使用POST,服务器仍然需要确认POST是否成功。您的意思是,服务器没有返回200或更多?是的,丹尼尔可能是对的。您挂起线程是因为它正在等待读取响应。你有没有被暂停过?这可能会作为一个例外出现。同样值得注意的是,AsynchTask使用的线程池非常有限。(因Android版本而异,但我相信~8是最常见的。)你看到了什么错误?我认为所有这些评论听起来都是对的。有趣的是,AsyncTask
知道HttpResponse
是否完成;任务等待响应完成。我认为任务将在“returnnull”时关闭,响应将丢失或是其他什么。