2013-01-09 110 views
5

我下載了jsoup庫jsoup-1.7.1.jar核心和使用項目它導入到我的項目 - >屬性 - > Java構建路徑 - >添加外部JAR並將庫文件粘貼到我的libs文件夾中。但是,將Jsoup庫導入到我的項目似乎存在一些問題。當我運行我的應用程序時,啓動時出現此錯誤。用jsoup解析拋出錯誤(NetworkOnMainThreadException)

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 

搜索和詢問後,我發現,日食看到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; 
    } 

} 

回答

15

你有

android.os.NetworkOnMainThreadException 

這無關你的罐子工作正常與否。

該異常是由新版本的Android引發的,因此您不要鎖定執行網絡操作的UI線程(這是主線程)。

使用​​(關於AsyncTask的每個部分可以找到什麼的簡單說明here)或另一個​​網絡的東西。如果需要在後臺工作完成時更新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(); 
+0

非常正確。 @Questions,你也可以使用我的DataLoader:https://github.com/christopherperry/dataloader(無恥插件) –

+0

我更新了我的問題並添加了我的源代碼。你能告訴我如何在這裏使用AsyncTask嗎?謝謝! – Questions

+0

@問題我用一個例子更新了我的答案。 –

-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" />