2013-01-09 13 views
5

मैं jsoup पुस्तकालय jsoup-1.7.1.jar कोर डाउनलोड किया है और परियोजना का उपयोग कर अपने प्रोजेक्ट के लिए आयातित -> गुण> पथ जावा बिल्ड -> जोड़ें बाहरी जार और मैंने पुस्तकालय फ़ाइल को मेरे libs फ़ोल्डर में चिपकाया। हालांकि मेरी परियोजना में जेएसओपी लाइब्रेरी आयात करने के बारे में कुछ समस्या है। जब मैं अपना ऐप चलाता हूं, लॉन्च करने पर मुझे यह त्रुटि मिलती है।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 दबाकर आयात को व्यवस्थित करने का प्रयास किया और मुझे एक ही त्रुटि मिल जाएगी। इस बिंदु पर, मुझे इस बारे में अनिश्चितता है कि क्या गलत है और इसे ठीक करने के बारे में कोई जानकारी नहीं है। मुझे उम्मीद है कि कोई मुझे समाधान की तरफ ले जाएगा। अपना समय प्रशंसा करो! आप एक

android.os.NetworkOnMainThreadException 

जो आपके जार ठीक से है या नहीं काम कर के साथ कोई संबंध नहीं है है

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

:

यह मेरा कोड है।

अपवाद को एंड्रॉइड के नए संस्करणों द्वारा फेंक दिया गया है ताकि आप यूआई थ्रेड (जो मुख्य थ्रेड है) नेटवर्क ऑपरेशंस को लॉक न करें।

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

मुझे लगता है:

  • कार्य अपनी गतिविधि में एक भीतरी वर्ग है।
  • आप यूआई एलिमेंट (जैसे TextView) पर प्राप्त शीर्षक को अग्रेषित कर रहे हैं, क्योंकि इसी तरह AsyncTasks का उपयोग आमतौर पर किया जाता है।

AsyncTask फोन करने के लिए, के बाद setContentView(R.layout.activity_main);

new MyTask().execute(); 
+0

बिल्कुल सही। @Questions, आप इसके लिए मेरे डेटालोडर का भी उपयोग कर सकते हैं: https://github.com/christopherperry/dataloader (लापरवाह प्लग) –

+0

मैंने अपना प्रश्न अपडेट किया और अपना स्रोत कोड जोड़ दिया। क्या आप मुझे दिखा सकते हैं कि आप यहां AsyncTask का उपयोग कैसे करेंगे? धन्यवाद! – Questions

+0

@ प्रश्नोत्तर मैंने एक उदाहरण के साथ अपना जवाब अपडेट किया। –

-3

आयात इन पुस्तकालय 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" /> 
संबंधित मुद्दे