приложение эмулятора падает при попытке соединения с jsoup в android studio - PullRequest
0 голосов
/ 05 января 2020

Нет ошибок при запуске и компиляции кода в 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();
    }


}

1 Ответ

1 голос
/ 06 января 2020

Это просто исключение, напечатанное 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();
}

Кроме того, не забудьте добавить Разрешение inte rnet в AndroidManifest.xml

<uses-permission android:name="android.permission.INTERNET" />

Но поскольку AsyncTask устарело, вы можете попробовать его альтернативу. Вот хороший учебник , в котором упоминаются некоторые варианты AsyncTask

...