使用jsoup获取url

时间:2016-03-01 10:03:12

标签: java android exception jsoup

尝试使用jsoup解析网站时,以下onTouch方法始终会在Jsoup.parse(url, 3000);

投放
public boolean onTouch(View v, MotionEvent event) {
    try {
        URL url = new URL("http://www.google.com");
        Document xmlDoc = Jsoup.parse(url, 3000);
        Elements title = xmlDoc.select("title");
        textView.setText(title.get(0).text());
    } catch (MalformedURLException e1) {
        e1.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }
    // ...
}

logcat的

03-01 09:44:08.901  23601-23601/com.takepickpicturedemo E/InputEventReceiver﹕ Exception dispatching input event.
03-01 09:44:08.902  23601-23601/com.takepickpicturedemo E/MessageQueue-JNI﹕ Exception in MessageQueue callback: handleReceiveCallback
03-01 09:44:08.903  23601-23601/com.takepickpicturedemo E/MessageQueue-JNI﹕ android.os.NetworkOnMainThreadException
            at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1273)
            at java.net.InetAddress.lookupHostByName(InetAddress.java:431)
            at java.net.InetAddress.getAllByNameImpl(InetAddress.java:252)
            at java.net.InetAddress.getAllByName(InetAddress.java:215)
            at com.android.okhttp.internal.Network$1.resolveInetAddresses(Network.java:29)
            at com.android.okhttp.internal.http.RouteSelector.resetNextInetSocketAddress(RouteSelector.java:188)
            at com.android.okhttp.internal.http.RouteSelector.nextProxy(RouteSelector.java:157)
            at com.android.okhttp.internal.http.RouteSelector.next(RouteSelector.java:100)
            at com.android.okhttp.internal.http.HttpEngine.createNextConnection(HttpEngine.java:357)
            at com.android.okhttp.internal.http.HttpEngine.nextConnection(HttpEngine.java:340)
            at com.android.okhttp.internal.http.HttpEngine.connect(HttpEngine.java:330)
            at com.android.okhttp.internal.http.HttpEngine.sendRequest(HttpEngine.java:248)
            at com.android.okhttp.internal.huc.HttpURLConnectionImpl.execute(HttpURLConnectionImpl.java:433)
            at com.android.okhttp.internal.huc.HttpURLConnectionImpl.connect(HttpURLConnectionImpl.java:114)
            at org.jsoup.helper.HttpConnection$Response.execute(HttpConnection.java:512)
            at org.jsoup.helper.HttpConnection$Response.execute(HttpConnection.java:493)
            at org.jsoup.helper.HttpConnection.execute(HttpConnection.java:205)
            at org.jsoup.helper.HttpConnection.get(HttpConnection.java:194)
            at org.jsoup.Jsoup.parse(Jsoup.java:183)
            at com.takepickpicturedemo.MainActivity.onTouch(MainActivity.java:449)
            at android.view.View.dispatchTouchEvent(View.java:9290)
            at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2553)
            at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2197)
            at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2553)
            at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2197)
            at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2553)
            at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2197)
            at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2553)
            at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2197)
            at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2553)
            at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2197)
            at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2553)
            at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2197)
            at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2553)
            at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2197)
            at com.android.internal.policy.PhoneWindow$DecorView.superDispatchTouchEvent(PhoneWindow.java:2403)
            at com.android.internal.policy.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1737)
            at android.app.Activity.dispatchTouchEvent(Activity.java:2765)
            at android.support.v7.internal.view.WindowCallbackWrapper.dispatchTouchEvent(WindowCallbackWrapper.java:59)
            at com.android.internal.policy.PhoneWindow$DecorView.dispatchTouchEvent(PhoneWindow.java:2364)
            at android.view.View.dispatchPointerEvent(View.java:9514)
            at android.view.ViewRootImpl$ViewPostImeInputStage.processPointerEvent(ViewRootImpl.java:4230)
            at android.view.ViewRootImpl$ViewPostImeInputStage.onProcess(ViewRootImpl.java:4096)
            at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3642)
            at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:3695)
            at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:3661)
            at android.view.ViewRootImpl$AsyncInputStage.forward(ViewRootImpl.java:3787)
            at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:3669)
            at android.view.ViewRootImpl$AsyncInputStage.apply(ViewRootImpl.java:3844)
            at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3642)
            at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:3695)
            at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:3661)
            at android.vie
03-01 09:44:08.905  23601-23601/com.takepickpicturedemo D/AndroidRuntime﹕ Shutting down VM

JSOUP :1.8.3

IDE :Android Studio 1.3.1

VM :Nexus 5 API23 x86

2 个答案:

答案 0 :(得分:2)

查看堆栈跟踪,您似乎正在尝试在主线程(NetworkOnMainThreadException)上进行网络调用。尝试在后台线程上运行onTouch处理程序内的代码,例如使用AsyncTask

答案 1 :(得分:0)

您不应该使用Jsoup直接解析网址。

在内部,Jsoup使用HttpUrlConnection下载网址内容。在Android平台上,此类已知问题并且速度很慢。你也不应该使用AsyncTask。我甚至不谈论HttpClient

而是使用Volley。比传统的Android加载网址方法快10倍(#1)。您可以在此处找到一个小示例代码:How to use Jsoup with Volley?

当问题中的堆栈跟踪出现时,主机名似乎无法解析。

(1):"Volley got a score up to ten times better than the other alternatives (...)"