android.os.NetworkOnMainThreadException 而不是使用 AsyncTask (jsoup) 修复

android.os.NetworkOnMainThreadException and not fix with AsyncTask (jsoup)

尝试在网络视图中显示网络的某些特定部分并使用 jsoup 库,因此 select 我的意图 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

经过一些研究,我知道这个错误是什么以及如何通过 this question (and not duplicate in my case) 将代码放入 AsyncTask 函数来解决这个问题我尝试了这个但没有用,似乎不可能将这个 jsoup 代码放入 AsyncTask 或者我不知道该怎么做...

如果有人可以帮助。

您不能在主线程上执行网络调用,这在过去几年 android 中一直存在(自 API 11 起)并且它存在是有充分理由的。

如果您在主线程上执行网络调用,您将导致 ANR 和跳帧,您的用户将卸载您的应用。

您应该使用任何方法在后台线程上发送请求(AsyncTask 或任何可用的网络库)

更多信息,请阅读this article

使用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();

}}