Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/218.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 为什么在执行无响应HTTP Post时线程池会被填满?_Android_Multithreading_Http - Fatal编程技术网

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”时关闭,响应将丢失或是其他什么。