2016-12-07 2 views
-1

пытаются показать некоторые конкретные части веб в веб-просмотра и использовать jsoup библиотеку так выбрать свой Предназначен DIV и это мой код:android.os.NetworkOnMainThreadException и не исправить с 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(); 
     } 

}} 

но при запуске это получило эту ошибку: android.os.NetworkOnMainThreadException

после некоторого исследования Я знаю, что это за ошибка и как решить эту проблему с помощью кодов в функции AsyncTask с помощью this question (and not duplicate in my case). Я пробовал это, но не работал, и кажется невозможным поставить этот код jsoup в AsyncTask или я не знаю, как это сделать ...

если возможно, имейте это в виду.

ответ

3

Используйте AsyncTask для загрузки документа

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

Невозможно распознать веб-просмотр в onPostExecute и после этого дать ошибку для .execute(); – erfan

+0

Изменить Webview на окончательный –

+0

ok Ошибка веб-браузера. но дать ошибку для .execute(); в onPostExecute. и для принятия вашего ответа, пожалуйста, отредактируйте свой код и покажите, как Вызов asynctask in on create meathod – erfan

1

Вы не можете выполнять сетевые вызовы в основном потоке, это было в андроиде в течение последних нескольких лет (начиная с API 11), и он существует по уважительной причине.

Если вы выполняете сетевые вызовы в своем основном потоке, вы вызываете ANR и пропускаете кадры, и ваши пользователи удаляют ваше приложение.

вы должны использовать любой метод отправки запросов в фоновом потоке (либо AsyncTask или любая библиотека сетей есть там)

больше, читайте this article

+0

Я знаю, что должен использовать AsyncTask, но я так много раз пытаюсь поместить эти коды jsoup в AsyncTask, но, похоже, не работает – erfan

+0

Возможно, jsoup не является подходящей библиотекой для работы в сети, вы пытались использовать [OkHttp] (http s: //github.com/square/okhttp) или [Volley] (https://developer.android.com/training/volley/index.html)? – thepoosh

Смежные вопросы