7

我下载了 jsoup 库jsoup-1.7.1.jar 核心并使用Project -> Properties->Java Build Path -> Add external 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;
    }

}
4

2 回答 2

22

你有一个

android.os.NetworkOnMainThreadException

这与您的罐子是否正常工作无关。

新版本的 Android 会抛出异常,因此您不会锁定 UI 线程(即主线程)进行网络操作。

使用AsyncTask(关于 AsyncTask 的每个部分的简单解释可以在这里找到)或另一个线程来处理网络内容。如果您需要在后台工作完成后更新 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);
  }
}

我假设:

  • 任务是 Activity 中的一个内部类。
  • 您正在将获得的标题转发给 UI 元素(例如 a TextView),因为 AsyncTasks 通常用于此目的。

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

new MyTask().execute();
于 2013-01-09T22:08:48.063 回答
-2

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

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

还要将此行添加到清单:

<uses-permission android:name="android.permission.INTERNET" />
于 2016-06-03T12:50:59.227 回答