2013-01-09 33 views
5

Tôi tải về các thư viện jsoup jsoup-1.7.1.jar lõi và nhập nó vào dự án của tôi bằng cách sử dụng Dự án -> Properties-> Java Build Path -> Add Chum bên ngoài và tôi đã dán tập tin thư viện vào thư mục libs của mình. Tuy nhiên có vẻ như có một số vấn đề về việc nhập thư viện Jsoup vào dự án của tôi. Khi tôi chạy ứng dụng của mình, khi khởi chạy, tôi nhận được lỗi này.Phân tích với jsoup ném lỗi (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 

Sau khi tìm kiếm và hỏi tôi phát hiện thấy nhật thực thấy jsoup.jar, nhưng không thể chuyển nó vào tệp APK để chạy ứng dụng. Tôi đã cố gắng tổ chức Nhập bằng cách nhấn Shift + Alt + O và tôi sẽ gặp lỗi tương tự. Tại thời điểm này, tôi không chắc chắn về những gì là sai và không có ý tưởng làm thế nào để sửa chữa nó. Tôi chỉ hy vọng một người nào đó sẽ dẫn tôi đến giải pháp. Đánh giá cao thời gian của bạn!

Đây là mã của tôi:

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; 
    } 

} 

Trả lời

15

Bạn có một

android.os.NetworkOnMainThreadException 

nào không có gì để làm với jar của bạn hoạt động bình thường hay không.

Ngoại lệ được ném bởi các phiên bản Android mới để bạn không khóa Chủ đề giao diện người dùng (đó là Chủ đề chính) thực hiện các hoạt động mạng.

Sử dụng AsyncTask (giải thích đơn giản về những gì mỗi phần của AsyncTask có thể được tìm thấy here) hoặc một Thread cho nội dung mạng khác. Asynctask dễ làm việc hơn nếu bạn cần cập nhật giao diện người dùng khi công việc nền hoàn thành.

Một ví dụ về một AsyncTask với cơ sở mã của bạn có thể là:

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); 
    } 
} 

tôi giả:

  • Nhiệm vụ là một nội lớp trong hoạt động của bạn.
  • Bạn đang chuyển tiếp tiêu đề được chuyển đến Phần tử giao diện người dùng (ví dụ: TextView) vì đó là những gì AsyncTask thường được sử dụng.

Để gọi AsyncTask, đặt này sau khi setContentView(R.layout.activity_main);

new MyTask().execute(); 
+0

Chính xác. @Questions, bạn có thể sử dụng DataLoader của tôi cho điều này là tốt: https://github.com/christopherperry/dataloader (plug shameless) –

+0

Tôi đã cập nhật câu hỏi của mình và thêm mã nguồn của mình. Bạn có thể chỉ cho tôi cách bạn sử dụng AsyncTask ở đây không? Cảm ơn! – Questions

+0

@Questions Tôi đã cập nhật câu trả lời của mình bằng một ví dụ. –

-3

nhập những thư viện android.os.NetworkOnMainThreadExceptionandroid.os.StrictMode và sử dụng dưới chế độ nghiêm ngặt

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

Ngoài ra thêm dòng này để bày tỏ:

<uses-permission android:name="android.permission.INTERNET" /> 
Các vấn đề liên quan