用jsoup解析抛出错误(NetworkOnMainThreadException)

时间:2013-01-09 22:04:26

标签: android parsing jsoup

我下载了jsoup库 jsoup-1.7.1.jar核心,并使用项目 - >将其导入我的项目属性 - > Java构建路径 - >添加外部Jars ,然后将库文件粘贴到我的libs文件夹中。但是,将Jsoup库导入我的项目似乎存在一些问题。当我运行我的应用程序时,启动时出现此错误。

12-26 22:59:24.133: E/AndroidRuntime(6710): FATAL EXCEPTION: main
12-26 22:59:24.133: E/AndroidRuntime(6710): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.jsouptest/com.example.jsouptest.MainActivity}: android.os.NetworkOnMainThreadException

搜索并询问后我发现eclipse看到了jsoup.jar,但无法将其打包到APK文件以供应用程序运行。我尝试按 Shift + Alt + O 组织Imports,我会得到同样的错误。在这一点上,我不确定什么是错的,不知道如何解决它。我只希望有人能引导我走向解决方案。感谢你的时间!

这是我的代码:

package com.example.jsouptest;

import java.io.IOException;

import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;

import android.app.Activity;
import android.os.Bundle;
import android.view.Menu;

public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
         Document doc;
         try {
             doc = Jsoup.connect("http://google.com/").get();
             String title = doc.title();
          System.out.print(title);
         } catch (IOException e) {
             // TODO Auto-generated catch block
             e.printStackTrace();
         }
         }




    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.activity_main, menu);
        return true;
    }

}

2 个答案:

答案 0 :(得分:19)

你有一个

android.os.NetworkOnMainThreadException

这与你的罐子正常工作无关。

新版本的Android会引发异常,因此您不会锁定执行网络操作的UI线程(主线程)。

使用AsyncTask(有关AsyncTask的每个部分可以找到的内容的简单说明here)或其他Thread用于网络内容。如果您需要在后台工作完成后更新UI,则Asynctask更易于使用。

使用代码库的AsyncTask示例可以是:

private class MyTask extends AsyncTask<Void, Void, String> {

  @Override
  protected String doInBackground(Void... params) {
    String title ="";
    Document doc;
    try {
      doc = Jsoup.connect("http://google.com/").get();
      title = doc.title();
      System.out.print(title);
    } catch (IOException e) {
      e.printStackTrace();
    }
    return title;   
  } 


  @Override
  protected void onPostExecute(String result) {        
    //if you had a ui element, you could display the title
    ((TextView)findViewById (R.id.myTextView)).setText (result);
  }
}

我假设:

  • 任务是您的活动中的内部类。
  • 您正在将标题转发给UI元素(例如TextView),因为这通常是AsyncTasks的用途。

要调用AsyncTask,请将其放在setContentView(R.layout.activity_main);

之后
new MyTask().execute();

答案 1 :(得分:-3)

导入这些库android.os.NetworkOnMainThreadExceptionandroid.os.StrictMode并使用以下严格模式

StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
StrictMode.setThreadPolicy(policy);

同时将此行添加到清单:

<uses-permission android:name="android.permission.INTERNET" />