Jsoup.connect() 在 Java 中可用,但在 Android 中不可用。

8
我尝试了Jsoup网站上提供的Jsoup.connect()示例,在Java中可以正常工作。
但是出于某种原因,在Android项目(Eclipse)中,即使我在AndroidManifest中允许了Internet访问权限,也无法使其正常工作。Jsoup库已经正确安装,我可以使用Jsoup.parse()而没有任何问题。下面是一些可用于Java的代码以及在AndroidManifest中的权限。
public static void main(String[] args){
    Document doc;
    try {
        doc = Jsoup.connect("http://google.ca/").get();
        String title = doc.title();
        System.out.print(title);
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

AndroidManifest.xml

<uses-sdk android:minSdkVersion="12" />
<uses-permission android:name="android.permission.INTERNET"/>
<application

当我尝试运行它时,它崩溃了,日志显示:
01-09 20:19:30.560: E/AndroidRuntime(26839): java.lang.RuntimeException: 
Unable to start activity 
ComponentInfo{com.mrdroidinator.com/com.mrdroidinator.com.Parselhjmq}: android.os.NetworkOnMainThreadException

01-09 20:19:30.560:E / AndroidRuntime(26839):java.lang.RuntimeException:无法启动活动ComponentInfo {com.mrdroidinator.com / com.mrdroidinator.com.Parselhjmq}:android.os.NetworkOnMainThreadException - user1139012
有人遇到过这个问题吗?我能够通过Java连接到Yahoo! API(OAuth),但在Eclipse的Android应用程序中无法工作。我猜这些问题是相关的? - user1139012
你是否在使用代理?也许代理没有为你的Android项目设置好? - B. Anderson
现在更容易了,可以在这里查看示例代码 https://github.com/square/okhttp/blob/master/samples/guide/src/main/java/okhttp3/recipes/AccessHeaders.java - Someone Somewhere
1个回答

16

http://developer.android.com/reference/android/os/NetworkOnMainThreadException.html

问题在于您正在主线程上执行网络操作,在 API 级别 11+ 中这是被禁止的。这是因为如果您这样做,UI 将会被“冻结”,直到文档下载完成,因此需要在不影响 UI 性能的情况下在不同的线程上执行此类操作。

以下是如何启动新线程的示例:

Thread downloadThread = new Thread() {
  public void run() {
    Document doc;
    try {
      doc = Jsoup.connect("http://google.ca/").get();
      String title = doc.title();
          System.out.print(title);
    } catch (IOException e) {
          e.printStackTrace();
    }
  }
};
downloadThread.start();

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接