Как перекинуть спарсенную через jsoup информацию в первый поток из второго

Вот код Activity, пока сделал Main для теста. Проблема в том, что я сделал второй поток и в нем спарсил страницу и выцепил нужные куски. Проблема в том, что я теперь не могу обновить ТекстВьювы из второго потока. Если выполнять парсинг из первого потока, то тогда неминуемый краш.

package ru.ursna.trulate;

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import android.widget.TextView;

import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.select.Elements;

import java.io.IOException;

public class MainActivity extends AppCompatActivity {
    private String url = "https://tl.rulate.ru/book/29738/637191/ready";
    private Document doc;
    private Thread SecondThread;
    private Runnable runnable;
    TextView Title = findViewById(R.id.Title);
    TextView TextContent = findViewById(R.id.Title);
    String TextTitle = "";

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

        init();
    }

    private void init() {
        runnable = new Runnable() {
            @Override
            public void run() {
                try {
                    load();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        };
        SecondThread = new Thread(runnable);
        SecondThread.start();
    }

    private void load() throws IOException {
        doc = Jsoup.connect(url).get();
    }

    private void content() {
        final String TextTitle = doc.title();
        final Elements Text = doc.select("div.content-text");
    }
}

Ответы (1 шт):

Автор решения: Roman Konoval

Для извещения главного потока о результатах работы используйте механизм обработчиков (handlers).

Он позволяет передавать сообщения и/или Runable в очередь сообщений потока.

public class MainActivity extends ... {

    // предполагаем, что load выполняется в отдельном потоке
    private void load() throws IOException {
        doc = Jsoup.connect(url).get();
        // Делаем все что нужно и получаем результат
        MyResult result = ...

        // Runnable переданный в post будет выполнен в главном потоке
        new Handler(Looper.getMainLooper()).post(new Runnable() {
            public void run() {
                // тут обновляем UI используя result т.д.
            } 
        });
    }

}
→ Ссылка