Java HTTP Post完全退出线程,未捕获异常,或永远挂起
我知道我的代码会因为其他症状而消亡,但即使我尝试/捕获了所有东西,也从来没有任何消息。我现在终于通过使用连续的输出语句缩小了范围Java HTTP Post完全退出线程,未捕获异常,或永远挂起,java,android,Java,Android,我知道我的代码会因为其他症状而消亡,但即使我尝试/捕获了所有东西,也从来没有任何消息。我现在终于通过使用连续的输出语句缩小了范围 String line = null; try { final HttpParams httpParams = new BasicHttpParams(); HttpConnectionParams.setConnectionTimeout(httpParams, 30000); DefaultH
String line = null;
try {
final HttpParams httpParams = new BasicHttpParams();
HttpConnectionParams.setConnectionTimeout(httpParams, 30000);
DefaultHttpClient httpClient = new DefaultHttpClient(httpParams);
HttpPost httpPost = new HttpPost(url);
postDebugMessage("GlobalApplication", "Info", "Executing httppost");
HttpResponse httpResponse = httpClient.execute(httpPost);
postDebugMessage("GlobalApplication", "Info", "Getting entity");
HttpEntity entity = httpResponse.getEntity();
postDebugMessage("GlobalApplication", "Info", "Converting to line");
line = EntityUtils.toString(entity); //<- the bad one
postDebugMessage("GlobalApplication", "Info", "Conversion completed.");
}
catch (Exception ex) {
// Any error occurring here we're going to state is
// a network error.
postDebugMessage("GlobalApplication", "Exception", ex.getStackTrace()[0].toString());
throw new NetworkNotAvailableException(ex.toString());
}
字符串行=null;
试一试{
最终HttpParams HttpParams=新的基本HttpParams();
HttpConnectionParams.setConnectionTimeout(httpParams,30000);
DefaultHttpClient httpClient=新的DefaultHttpClient(httpParams);
HttpPost HttpPost=新的HttpPost(url);
postDebugMessage(“GlobalApplication”、“Info”、“正在执行httppost”);
HttpResponse HttpResponse=httpClient.execute(httpPost);
postDebugMessage(“全局应用程序”、“信息”、“获取实体”);
HttpEntity entity=httpResponse.getEntity();
postDebugMessage(“全局应用程序”、“信息”、“转换为行”);
line=EntityUtils.toString(entity);//不一定。我怀疑您可能会得到一个扩展错误而不是异常的未检查异常。请尝试放置catch(Throwable t)并查看它是否捕获到异常。您可能不希望实际捕获这些异常,因为如果出现内存不足异常,系统随后的状态可能不可预测。不一定。我怀疑您可能会得到一个扩展错误的未检查异常,而不是异常。请尝试放置捕获(可丢弃的t)然后查看它是否捕捉到了异常。您可能不希望实际捕捉到这些异常,因为如果出现内存不足异常,系统随后的状态可能不可预测。EntityUtils.toString(entity)
首先读取一些数据,然后执行以下操作:
char[] tmp = new char[1024];
int l;
while((l = reader.read(tmp)) != -1) {
buffer.append(tmp, 0, l);
}
因此,只要服务器发送更多数据,该方法就会被阻止。我希望您没有连接到流媒体服务?EntityUtils。toString(entity)
首先读取一些数据,然后执行以下操作:
char[] tmp = new char[1024];
int l;
while((l = reader.read(tmp)) != -1) {
buffer.append(tmp, 0, l);
}
因此,只要服务器发送更多数据,该方法就会被阻止。我希望您还没有连接到流媒体服务?我将调用此应答,因为我已经解决了问题,但它与EntityUtils调用无关(至少据我所知)
完全退出线程并不是一个例外,它只是一个挂起的线程。罪魁祸首是我输入了连接超时,但不是套接字连接超时。文档说默认值是无限超时……这就是我看到的我要说的。我补充说:
HttpConnectionParams.setSoTimeout(httpParams, 30000);
从那以后就再也没见过这个问题了
我知道至少有一个日志显示entityUtils调用从未完成,所以这让我认为是这样的,但之后更多的日志显示是.execute(httpPost)从未完成,所以这让我看了一下
感谢您的帮助!我将呼叫此已应答,因为我已经解决了我的问题,但它似乎与EntityUtils呼叫无关(至少据我所知)
完全退出线程并不是一个例外,它只是一个挂起的线程。罪魁祸首是我输入了连接超时,但不是套接字连接超时。文档说默认值是无限超时……这就是我看到的我要说的。我补充说:
HttpConnectionParams.setSoTimeout(httpParams, 30000);
从那以后就再也没见过这个问题了
我知道至少有一个日志显示entityUtils调用从未完成,所以这让我认为是这样的,但之后更多的日志显示是.execute(httpPost)从未完成,所以这让我看了一下
谢谢您的帮助!是的,整个异常会捕获到它,所以这不是问题所在。是的,扩展java.lang.Exception并被try/catch块捕获。您的url是什么?响应应该是什么样子?您能确保服务器响应您期望的吗?我在“line”上执行操作我现在做一个显式检查,看看EntityUtils.toString()调用中的行是否为null。实际上,我用try/catch(异常)包围了这些行操作,所以我认为NPE稍后也会被捕获。我只是再次运行它,这次输出语句指示它在之后立即停止运行“执行Httppost"。从那时起,就不再有调试语句了。我想它可能会完全退出线程,或者永远挂起。我所有的问题似乎都在上面的try块中,但没有一个特定的位置。是的,整个异常会捕获它,所以这不是问题。是的,扩展java.lang.Exception并被捕获通过try/catch块。你的url是什么?响应应该是什么样子?你能确保服务器响应你期望的吗?我在“line”上做进一步的操作。我现在做一个显式的检查,看看在EntityUtils.toString()调用中line是否为null。我实际上有一个try/catch(异常)围绕着这些行操作,因此我认为NPE稍后也会被捕获。我只是再次运行它,这次输出语句表明它在“执行Httppost”后立即停止运行.从那时起,就不再有调试语句了。我想可能是完全退出线程,也可能是永远挂起。我所有的问题似乎都在上面的try块中,但没有一个特定的位置。然后他会得到一个崩溃报告。我没有得到任何类型的崩溃报告,应用程序也没有。它像norma一样继续l、 我将添加捕获(可丢弃的t)看看我能得到什么。如果我让设备运行足够长的时间,或者进入一个接收信号不稳定的区域,这似乎有点容易重复。我现在在整个过程中添加了大量捕获。它在恶劣的环境中运行了很长时间,到目前为止,它没有像以前那样失败。我看到的主要例外是IOException,操作超时。我没有得到任何gener