Каков наиболее оптимальный способ получить значение из потока и использовать его в основном потоке сразу после разрешения потока?

#java #android #multithreading

Вопрос:

Я создаю приложение для Android, которое очищает веб-сайт и помещает очищенную информацию в список. Проблема, с которой я сталкиваюсь, заключается в том, что мне приходится блокировать основной поток на некоторое время, пока не будет выполнена очистка.

 int opt = 0;
String phone = "";

...

adAdapter = new AdAdapter(new AdDiffer(), ad ->
{

    new Thread(new Runnable()
        {
            @Override
            public void run()
            {
                try
                {
                    Document doc = Jsoup.connect(ad.getUrl()).get();

                    Element elem = doc.getElementsByClass("hGYViW").get(0).....

                    Elements e = null;

                    try
                    {
                        e = elem.getElementsByTag("div").get(0).getElementsByClass("hMvGEj");
                    }
                    catch (Exception ex) {}

                    if(e.size() != 0)
                    {
                        phone = elem.getElementsByTag("div").get(0).getElementsByClass("hMvGEj").get(0).getElementsByTag("a").get(0).html();
                        opt = 2;
                    }
                    else
                    {
                        opt = 1;
                    }
                }
                catch (IOException e)
                {
                    e.printStackTrace();
                }
            }

        }).start();

        while(opt == 0) {}

        if(opt == 2)
        {
            opt = 0;
            phone = "";
            Intent intent = new Intent(Intent.ACTION_CALL);
            intent.setData(Uri.parse("tel:"   phone));
            startActivity(intent);
        }
        else
        {
            opt = 0;
            phone = "";
            startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse(ad.getUrl())));
        }
        return null;
});
 

Есть ли способ заставить это работать без необходимости блокировать основной поток?

Комментарии:

1. «Есть ли способ заставить это работать без необходимости блокировать основной поток?» — используйте реактивные API ( LiveData , RxJava, сопрограммы Kotlin Future и т. Д.). Смотрите Документацию или любую приличную современную книгу или курс по разработке приложений для Android.

2. Большое вам спасибо!

3. Вы можете использовать an interface для связи между потоками. Очень похоже на то, как setOnClickListener() это работает. Используйте обработчик для передачи данных в основной поток — рекомендуется. В конце концов, все зависит от того, как вы кодируете свою программу.