在 android studio 中尝试连接 jsoup 时模拟器应用程序崩溃

emulator app crashes when trying to connect with jsoup in android studio

在 运行 和 android studio 中编译代码时没有错误,但是在按下按钮连接 jsoup 之后,应用程序由于某种原因崩溃了。有人知道我做错了什么吗?

package com.example.myapplication;

import androidx.appcompat.app.AppCompatActivity;

import android.os.AsyncTask;
import android.os.Bundle;
import android.view.View;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import java.io.IOException;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

    }


    class JsoupParseTask extends AsyncTask<String, Void, Document> {

        protected Document doInBackground(String... urls) {

            Document doc = null;
            try {
                doc = Jsoup.connect("http://google.com/").get();
            }
            catch (IOException e)
            {
                e.printStackTrace();
            }

            return doc;
        }
    }

    public void connect(View v) {

        // Call from here, it will execute doInBackground
        new JsoupParseTask().execute();
    }


}

它只是一个类型为 NetworkOnMainThreadException 的异常,当应用程序试图在其主线程上执行网络操作时会抛出该异常。

例如,尝试 运行 您在 AsyncTask 中的代码:

class JsoupParseTask extends AsyncTask<String, Void, Document> {

    @Override
    protected Document doInBackground(String... urls) {

        Document doc = null;
        try {
            doc = Jsoup.connect("http://google.com/").get();
        }
        catch (IOException e)
        {
            e.printStackTrace();
        }

        return doc;
    }

    @Override    
    protected void onPostExecute(Document doc) { 
        // execution of result here 

        String title = doc.title();
    }

}

并像下面这样称呼它:

public void connect(View v) {

    // Call from here, it will execute doInBackground
    new JsoupParseTask().execute();
}

除此之外不要忘记在 AndroidManifest.xml

中添加互联网权限
<uses-permission android:name="android.permission.INTERNET" />

但由于 AsyncTask 已弃用,您可以尝试使用它的替代方法。这是一个不错的 tutorial,其中提到了 AsyncTask

的一些替代方案