java - 在 client.execute(httpGet) 的 doInBackground() 行上发生崩溃。为什么?

标签 java android multithreading crash thread-safety

崩溃是:java.lang.RuntimeException:执行 doInBackground() 时发生错误

为什么我在此处的 HttpResponse response = client.execute(httpGet); 行发生崩溃?跟我的ThreadPolicy有关系吗?

在我的 fragment 中,我称之为:

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)

最佳答案

从 BugSense 更新到 Splunk Mint 后,我​​遇到了同样的问题,我的代码没有任何问题。在我注释掉 Splunk.init(...) 方法调用之后,一切又开始工作了。问题仅发生在 HTC 设备上并且启用了 Splunk Mint - HttpClient#execute() 方法的所有调用都抛出 DelegationException。不确定这是否是您的情况,但也许我的回答会帮助遇到与我相同问题的人。

关于java - 在 client.execute(httpGet) 的 doInBackground() 行上发生崩溃。为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26163990/

相关文章:

java - Appium 不显示 webview 上下文,它只显示 native 应用程序上下文。如何获取 webview 上下文?

java - 在Java MapReduce中,Reducer的可迭代值似乎不一致

java - Selenium : Converting List<WebElement> to Set<String>

android - 如何测试应用内支付和getSkuDetails?

c# - 如何在Orchard Modules中实现多线程?

java - 带列表字段的 ACCEPT_EMPTY_STRING_AS_NULL_OBJECT

android - 从服务接收触摸事件(解决方案?)

java - Android WebView单图,去除右侧空白

Python GIL 和线程同步

c# - C# 中的新 AutoResetEvent (true) 用法?