【发布时间】:2014-08-28 13:07:48
【问题描述】:
我每周都会在崩溃日志中看到此错误数百次,但此时我已经花了数周时间试图追查该错误,但没有任何成功。我无法在我的任何设备上重现它。这是堆栈跟踪:
Posix.java:-2 in "libcore.io.Posix.recvfromBytes"
Posix.java:131 in "libcore.io.Posix.recvfrom"
BlockGuardOs.java:164 in "libcore.io.BlockGuardOs.recvfrom"
IoBridge.java:513 in "libcore.io.IoBridge.recvfrom"
PlainSocketImpl.java:489 in "java.net.PlainSocketImpl.read"
PlainSocketImpl.java:46 in "java.net.PlainSocketImpl.access$000"
PlainSocketImpl.java:241 in "java.net.PlainSocketImpl$PlainSocketInputStream.read"
AbstractSessionInputBuffer.java:103 in "org.apache.http.impl.io.AbstractSessionInputBuffer.fillBuffer"
AbstractSessionInputBuffer.java:191 in "org.apache.http.impl.io.AbstractSessionInputBuffer.readLine"
DefaultResponseParser.java:82 in "org.apache.http.impl.conn.DefaultResponseParser.parseHead"
AbstractMessageParser.java:174 in "org.apache.http.impl.io.AbstractMessageParser.parse"
AbstractHttpClientConnection.java:180 in "org.apache.http.impl.AbstractHttpClientConnection.receiveResponseHeader"
DefaultClientConnection.java:235 in "org.apache.http.impl.conn.DefaultClientConnection.receiveResponseHeader"
AbstractClientConnAdapter.java:259 in "org.apache.http.impl.conn.AbstractClientConnAdapter.receiveResponseHeader"
HttpRequestExecutor.java:279 in "org.apache.http.protocol.HttpRequestExecutor.doReceiveResponse"
HttpRequestExecutor.java:121 in "org.apache.http.protocol.HttpRequestExecutor.execute"
DefaultRequestDirector.java:428 in "org.apache.http.impl.client.DefaultRequestDirector.execute"
AbstractHttpClient.java:555 in "org.apache.http.impl.client.AbstractHttpClient.execute"
AbstractHttpClient.java:487 in "org.apache.http.impl.client.AbstractHttpClient.execute"
AbstractHttpClient.java:465 in "org.apache.http.impl.client.AbstractHttpClient.execute"
Utilities.java:484 in "com.myapp.android.Utilities$8.run"
这是错误来自的代码块...崩溃发生的确切位置是HttpResponse response = httpclient.execute(httppost);:
public static HttpPost postData(String URL, final List<NameValuePair> params, final Handler handler) {
// Create a new HttpClient and Post Header
//android.util.Log.d("Utilities", "Called postData");
final HttpClient httpclient = new DefaultHttpClient();
//httpclient.
final HttpPost httppost = new HttpPost(URL);
final Message msg = new Message();
final Bundle dataBundle = new Bundle();
final ByteArrayOutputStream out = new ByteArrayOutputStream();
new Thread(){
@Override
public void run(){
String error = "";
String data = "";
try {
httppost.setEntity(new UrlEncodedFormEntity(params));
HttpResponse response = httpclient.execute(httppost);
StatusLine statusLine = response.getStatusLine();
if(statusLine.getStatusCode() == HttpStatus.SC_OK){
response.getEntity().writeTo(out);
out.close();
data = out.toString();
} else{
error = EntityUtils.toString(response.getEntity());
}
} catch (ClientProtocolException e) {
AirbrakeNotifier.notify(e);
error = e.toString();
} catch (IOException e) {
AirbrakeNotifier.notify(e);
error = e.toString();
} catch (Exception ex) {
AirbrakeNotifier.notify(ex);
error = ex.toString();
}
dataBundle.putString("error", error);
dataBundle.putString("data", data);
msg.setData(dataBundle);
handler.dispatchMessage(msg);
}
}.start();
return httppost;
}
非常感谢您对最终解决这个问题的任何帮助!
【问题讨论】:
-
调试不可见的代码很难。
-
对不起,添加了一些代码来看看。
-
另一个线程正在关闭套接字,而这个线程在 read() 中被阻塞。您是否有机会重用 HTTPClient?
-
不,没有其他线程关闭套接字。每次我们想在应用中发出请求时,我们都会使用
postData函数。 -
我假设您的描述意味着您的应用程序的用户正在看到此崩溃并且您无法重现它。如果是这种情况,也许他们只是互联网连接不好,您需要更优雅地处理这些错误。在测试您的应用程序时,请尝试在您的应用程序运行时切断互联网连接,看看它是否会重现类似的东西。如果是时间问题,请在故障线之前休眠,这样您就可以确保在继续之前切断数据连接。
标签: java android android-asynctask android-studio androidhttpclient