#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, сопрограммы KotlinFuture
и т. Д.). Смотрите Документацию или любую приличную современную книгу или курс по разработке приложений для Android.2. Большое вам спасибо!
3. Вы можете использовать an
interface
для связи между потоками. Очень похоже на то, какsetOnClickListener()
это работает. Используйте обработчик для передачи данных в основной поток — рекомендуется. В конце концов, все зависит от того, как вы кодируете свою программу.