7

jsoupライブラリjsoup-1.7.1.jarコアをダウンロードし、[プロジェクト] ->[プロパティ]->[Javaビルドパス]->[外部Jarの追加]を使用してプロジェクトにインポートし、ライブラリファイルを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を押してインポートを整理しようとすると、同じエラーが発生します。この時点で、私は何が間違っているのかわからず、それを修正する方法がわかりません。誰かが私を解決策に導いてくれることを願っています。あなたの時間を感謝します!

これは私のコードです:

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

これは、jarが正しく機能しているかどうかとは関係ありません。

例外はAndroidの新しいバージョンによってスローされるため、ネットワーク操作を実行するUIスレッド(メインスレッド)をロックしません。

AsyncTask ( AsyncTaskの各部分が何をするかについての簡単な説明はここにあります)またはネットワーク関連の別のスレッドを使用します。バックグラウンド作業が完了した後でUIを更新する必要がある場合は、非同期タスクの方が操作が簡単です。

コードベースを使用した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();
于 2013-01-09T22:08:48.063 に答える
-2

android.os.NetworkOnMainThreadExceptionこれらのライブラリをインポートしandroid.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 に答える