简体   繁体   English

使用jsoup的异常调度输入事件获取URL

[英]Exception dispatching input event with jsoup get url

When trying to parse a website using jsoup , the following onTouch method always throws at Jsoup.parse(url, 3000); 当尝试使用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 : 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 JSOUP :1.8.3

IDE : Android Studio 1.3.1 IDE :Android Studio 1.3.1

VM : Nexus 5 API23 x86 虚拟机 :Nexus 5 API23 x86

Looking at the stacktrace, it appears that you are trying to make a network call on the main thread ( NetworkOnMainThreadException ). 查看stacktrace,您似乎正在尝试在主线程上进行网络调用( NetworkOnMainThreadException )。 Try running the code inside the onTouch handler on a background thread, for instance using AsyncTask 尝试在后台线程上的onTouch处理程序中运行代码,例如使用AsyncTask

You shouldn't use Jsoup for parsing the url directly. 您不应该使用Jsoup直接解析URL。

Internally, Jsoup uses HttpUrlConnection for downloading the url content. 在内部,Jsoup使用HttpUrlConnection来下载URL内容。 On the Android Platform, this class has known issues and is slow. 在Android平台上,此类存在已知问题且运行缓慢。 You shouldn't use AsyncTask either. 您也不应该使用AsyncTask I don't even talk about HttpClient . 我什至不谈论HttpClient

Instead use Volley . 而是使用Volley It is ten "times faster"(1) than traditional Android approaches for loading urls. 它比传统的Android网址加载方法快十倍(1)。 You can find a small sample code here: How to use Jsoup with Volley? 您可以在此处找到一个小的示例代码: 如何在Volley中使用Jsoup?

As the stacktrace in the question appears, it seems a hostname can't be resolved. 当出现问题中的stacktrace时,似乎无法解析主机名。


(1): " Volley got a score up to ten times better than the other alternatives (...) " (1): Volley的得分比其他选择高出十倍(...)

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM