android.os.NetworkOnMainThreadException и не исправить с помощью AsyncTask (jsoup)

попробуйте показать определенную часть сети в веб-представлении и используйте библиотеку jsoup, поэтому выберите мой предполагаемый div, и это мой код:

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 с этот вопрос (и не дублировать в моем случае) я пытаюсь это сделать, но не работает, и кажется, что невозможно поместить эти коды jsoup в AsyncTask, или я не знаю, как это сделать...

если кто может помогите.


person Erfan    schedule 07.12.2016    source источник


Ответы (2)


Используйте 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();

}}
person J.R    schedule 07.12.2016
comment
не могу распознать веб-просмотр в onPostExecute и после этого выдать ошибку для .execute(); - person Erfan; 07.12.2016
comment
Изменить веб-просмотр на окончательный - person J.R; 07.12.2016
comment
хорошо, ошибка веб-просмотра исчезла. но выдать ошибку для .execute(); в onPostExecute. и для того, чтобы принять ваш ответ, отредактируйте свой код и покажите, как вызывать асинхронную задачу при создании мяса. - person Erfan; 07.12.2016
comment
Он уже вызывает выполнение асинхронной задачи. Вы можете увидеть .execute(); в конце кода. - person J.R; 07.12.2016
comment
Изменить документ document = Jsoup.connect(memaraneha.ir).timeout(20*1000) .получить(); - person J.R; 07.12.2016
comment
Давайте продолжим обсуждение в чате. - person Erfan; 07.12.2016

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

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

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

подробнее см. в этой статье.

person thepoosh    schedule 07.12.2016
comment
я знаю, что должен использовать AsyncTask, но я много раз пытался поместить коды jsoup в AsyncTask, но, похоже, не работает - person Erfan; 07.12.2016
comment
возможно, библиотека jsoup не подходит для работы в сети. Пробовали ли вы использовать OkHttp или Залп? - person thepoosh; 07.12.2016