2016-12-07 3 views
-1

versuchen, einigen spezifischen Teil des Web in Web-Ansicht zu zeigen und jsoup Bibliothek verwenden, um meine Beabsichtigte div wählen und dies ist mein Code:android.os.NetworkOnMainThreadException und nicht fix mit AsyncTask (jsoup)

public class MainActivity extends AppCompatActivity { 


    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main_page); 
     WebView webView = (WebView) findViewById(R.id.web); 
     webView.getSettings().setJavaScriptEnabled(true); 

     try { 
      Document document = Jsoup.connect("http://www.memaraneha.ir").get(); 
      Element elements=document.select("div.news-list").first(); 
      String html = elements.toString(); 
      String mime = "text/html"; 
      String encoding = "utf-8"; 
      webView.loadData(html, mime, encoding); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 

}} 

aber Wenn dies ausgeführt wird, bekam dieser Fehler: android.os.NetworkOnMainThreadException

Ich weiß, was ist dieser Fehler und wie muss ich das lösen mit Put-Codes in AsyncTask-Funktion mit this question (and not duplicate in my case) Ich versuche dies aber nicht funktionieren und scheint nicht möglich zu setzen diese jsoup-Codes in AsyncTask oder ich weiß nicht, wie das tun muss ...

wenn jemand bitte helfen kann.

Antwort

3

Verwenden AsyncTask lädt das Dokument

verwenden sollte
public class MainActivity extends AppCompatActivity { 


    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main_page); 
     WebView webView = (WebView) findViewById(R.id.web); 
     webView.getSettings().setJavaScriptEnabled(true); 

     new AsyncTask<Void, Void, String>() { 
      @Override 
      protected String doInBackground(Void... voids) { 
       String html = ""; 
       try { 
        Document document = Jsoup.connect("http://www.memaraneha.ir").get(); 
        Element elements=document.select("div.news-list").first(); 
        html = elements.toString(); 
       } catch (IOException e) { 
        e.printStackTrace(); 
       } 

       return html; 
      } 

      @Override 
      protected void onPostExecute(String html) { 
       String mime = "text/html; charset=utf-8"; 
       String encoding = "utf-8"; 
       webView.loadData(html, mime, encoding); 
      } 
     }.execute(); 

}} 
+0

kann Webview in onPostExecute nicht erkennen und gibt danach Fehler für .execute(); – erfan

+0

Ändern Sie Webview zu endgültigen –

+0

ok Webview Fehler gegangen. aber gib Fehler für .execute(); in onPostExecute. und für die Annahme Ihrer Antwort bitte bearbeiten Sie Ihren Code und zeigen Sie, wie Aufruf von asynctask in auf Meathod erstellen – erfan

1

Sie können keine Netzwerkaufrufe auf dem Hauptthread ausführen, dies ist in den letzten Jahren (seit API 11) in android gewesen und es ist aus einem guten Grund da.

Wenn Sie in Ihrem Haupt-Thread Netzwerkanrufe ausführen, verursachen Sie ANRs und überspringen Frames und Ihre Benutzer deinstallieren die App.

Sie eine Methode zum Senden der Anforderungen auf einem Hintergrund-Thread (entweder AsyncTask oder eine Netzwerkbibliothek gibt es da draußen)

für mehr lesen this article

+0

Ich weiß, sollte AsyncTask verwenden, aber ich versuche so viele Male für diese jsoup Codes in AsyncTask aber scheint nicht funktionieren – erfan

+0

vielleicht jsoup ist nicht die richtige Bibliothek für Netzwerke, haben Sie versucht mit [OkHttp] (https : //github.com/square/okhttp) oder [Volley] (https://developer.android.com/training/volley/index.html)? – thepoosh

Verwandte Themen