在 client.execute(httpGet) 上的 doInBackground() 行上发生崩溃。为啥?
Posted
技术标签:
【中文标题】在 client.execute(httpGet) 上的 doInBackground() 行上发生崩溃。为啥?【英文标题】:Getting a crash on doInBackground() line on client.execute(httpGet). Why?在 client.execute(httpGet) 上的 doInBackground() 行上发生崩溃。为什么? 【发布时间】:2014-11-27 15:05:57 【问题描述】:崩溃是:java.lang.RuntimeException: An error occured while executing doInBackground()
为什么我在这里的HttpResponse response = client.execute(httpGet);
行崩溃了?跟我的ThreadPolicy
有关系吗?
从我的片段中我称之为:
new ReadJSONFeedMainTask().execute(urlString);
....
private class ReadJSONFeedMainTask extends AsyncTask<String, Void, String>
protected String doInBackground(String... urls)
return Helper.readJSONFeed(urls[0]);
protected void onPostExecute(String result)
// do stuff
然后在这里调用:
public static String readJSONFeed(String URL)
ThreadPolicy tp = ThreadPolicy.LAX;
StrictMode.setThreadPolicy(tp);
String numberValue = URL.replaceAll(" ", "%20");
StringBuilder stringBuilder = new StringBuilder();
HttpClient client = new DefaultHttpClient();
HttpGet httpGet = new HttpGet(numberValue);
try
HttpResponse response = client.execute(httpGet);
StatusLine statusLine = response.getStatusLine();
int statusCode = statusLine.getStatusCode();
if (statusCode == 200)
HttpEntity entity = response.getEntity();
InputStream content = entity.getContent();
BufferedReader reader = new BufferedReader(new InputStreamReader(content));
String line;
while ((line = reader.readLine()) != null)
stringBuilder.append(line);
else
Log.e("JSON", "Failed to download file");
catch (ClientProtocolException e)
e.printStackTrace();
catch (IOException e)
e.printStackTrace();
return stringBuilder.toString();
堆栈跟踪:
java.lang.RuntimeException: An error occured while executing doInBackground()
1 at android.os.AsyncTask$3.done(AsyncTask.java:299)
2 at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:352)
3 at java.util.concurrent.FutureTask.setException(FutureTask.java:219)
4 at java.util.concurrent.FutureTask.run(FutureTask.java:239)
5 at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:230)
6 at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1080)
7 at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:573)
8 at java.lang.Thread.run(Thread.java:856)
9Caused by: com.splunk.mint.network.util.DelegationException: java.net.ConnectException: failed to connect to 50-89-72-86.res.bhn.net/50.89.72.86 (port 80): connect failed: ETIMEDOUT (Connection timed out)
10 at com.splunk.mint.network.util.Delegator.invoke0(Delegator.java:62)
11 at com.splunk.mint.network.util.Delegator.invoke(Delegator.java:45)
12 at com.splunk.mint.network.socket.MonitoringSocketImpl.connect(MonitoringSocketImpl.java:118)
13 at java.net.Socket.connect(Socket.java:842)
14 at org.apache.http.conn.scheme.PlainSocketFactory.connectSocket(PlainSocketFactory.java:119)
15 at org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java:144)
16 at org.apache.http.impl.conn.AbstractPoolEntry.open(AbstractPoolEntry.java:164)
17 at org.apache.http.impl.conn.AbstractPooledConnAdapter.open(AbstractPooledConnAdapter.java:119)
18 at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:360)
19 at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:555)
20 at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:487)
21 at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:465)
22 at com.sortitapps.movies.Helper.readJSONFeed(Helper.java:1282)
23 at com.sortitapps.movies.MainFragment$ReadJSONFeedMainTask.doInBackground(MainFragment.java:680)
24 at com.sortitapps.movies.MainFragment$ReadJSONFeedMainTask.doInBackground(MainFragment.java:678)
25 at android.os.AsyncTask$2.call(AsyncTask.java:287)
26 at java.util.concurrent.FutureTask.run(FutureTask.java:234)
27 ... 4 more
28Caused by: java.net.ConnectException: failed to connect to 50-89-72-86.res.bhn.net/50.89.72.86 (port 80): connect failed: ETIMEDOUT (Connection timed out)
29 at libcore.io.IoBridge.connect(IoBridge.java:114)
30 at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:192)
31 at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:459)
32 at java.lang.reflect.Method.invokeNative(Native Method)
33 at java.lang.reflect.Method.invoke(Method.java:511)
34 at com.splunk.mint.network.util.Delegator.invoke0(Delegator.java:56)
35 ... 20 more
36Caused by: libcore.io.ErrnoException: connect failed: ETIMEDOUT (Connection timed out)
37 at libcore.io.Posix.connect(Native Method)
38 at libcore.io.BlockGuardOs.connect(BlockGuardOs.java:85)
39 at libcore.io.IoBridge.connectErrno(IoBridge.java:127)
40 at libcore.io.IoBridge.connect(IoBridge.java:112)
【问题讨论】:
发布您的堆栈跟踪。 你的异步任务在哪里? 错误是 - java.net.ConnectException: failed to connect to 50-89-72-86.res.bhn.net/50.89.72.86 (port 80): connect failed: ETIMEDOUT (Connection超时)听起来您的手机/模拟器由于某种原因无法访问该 URL(网络问题,根本无法访问互联网,服务器没有响应??) 谢谢@deive 我什至没有想到那条线。有没有适当的方法来处理这样的连接超时? 通常你会为网络调用实现重试,在这种情况下你会休眠一段时间(可能每次尝试都有回退以休眠更长时间)。 【参考方案1】:从 BugSense 更新到 Splunk Mint 后我遇到了同样的问题,我的代码没有任何问题。在我注释掉 Splunk.init(...) 方法调用后,一切又开始工作了。问题仅出现在 HTC 设备上并且启用了 Splunk Mint - HttpClient#execute() 方法的所有调用都抛出了委派异常。不确定这是否是您的情况,但也许我的回答会帮助遇到与我相同问题的人。
【讨论】:
这是问题的正确来源。 Splunk 库有一个名为“网络监控”的功能,它显然是错误的,并且会导致任何网络故障抛出他们的委托异常。更多信息隐藏在他们的文档中:docs.splunk.com/Documentation/MintSDKs/latest/SplunkMINTSDKs/… 您可以在致电Mint.initAndStartSession()
之前立即致电 Mint.disableNetworkMonitoring()
禁用它
你使用的是什么版本的库?从你的经验来看,为什么它有问题?
我认为它也已被报告,但不会导致应用真正崩溃。【参考方案2】:
看起来很清楚,堆栈跟踪的结尾表明连接超时。您的服务器无法访问。
【讨论】:
是的,你是对的,其他人指出了这一点,我的眼睛只是集中在我的代码所在的堆栈跟踪部分。在此代码中处理超时连接的正确方法是什么? Timeout 实际上是一个 java.net.ConnectException 这是一个 IOException 但在你的情况下,它触发了一个 com.splunk.mint.network.util.DelegationException (我不知道 splunk) .这个没有在你的 try catch 块中处理。【参考方案3】:您应该将 Asynctask 用于任何与服务器的工作,请参阅http://developer.android.com/reference/android/os/AsyncTask.html
【讨论】:
他正在使用 AsyncTask @Selvin 这个代码是作者后来在我回答之后添加的。 问题的标题是什么?以上是关于在 client.execute(httpGet) 上的 doInBackground() 行上发生崩溃。为啥?的主要内容,如果未能解决你的问题,请参考以下文章
android http 通信(httpclient 实现)
如何在 Java 中与 HttpGet 一起发送 cookie
httpclient调用execute(httpget)报错
在 android 中调用 httpget 时出错(检索 google 方向)
如何在 ASP.NET CORE 3.0 中配置路由以使用带有 [FromQuery] 参数的重载 [HttpGet] 方法?