1

When trying to parse a website using jsoup, the following onTouch method always throws at 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

friederbluemle
  • 33,549
  • 14
  • 108
  • 109
JimmyHo
  • 279
  • 1
  • 5
  • 14

2 Answers2

2

Looking at the stacktrace, it appears that you are trying to make a network call on the main thread (NetworkOnMainThreadException). Try running the code inside the onTouch handler on a background thread, for instance using AsyncTask

friederbluemle
  • 33,549
  • 14
  • 108
  • 109
0

You shouldn't use Jsoup for parsing the url directly.

Internally, Jsoup uses HttpUrlConnection for downloading the url content. On the Android Platform, this class has known issues and is slow. You shouldn't use AsyncTask either. I don't even talk about HttpClient.

Instead use Volley. It is ten "times faster"(1) than traditional Android approaches for loading urls. You can find a small sample code here: How to use Jsoup with Volley?

As the stacktrace in the question appears, it seems a hostname can't be resolved.


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

Community
  • 1
  • 1
Stephan
  • 41,764
  • 65
  • 238
  • 329