Как обновить адаптер в реальном времени
Я заметил что если метод содержит try и catch (то есть исключения) то функция адаптер обновляется только тогда когда цикл заканчивается, как мне решить эту проблему? MainActivity:
for (int i=0; i<listlinks.size();i++ ){
listEmails.add(String.valueOf(bb++));
try {
listEmails.add(getEmailsFromLink(listlinks.get(i)));
listViewEmails.setAdapter(adapter);
adapter.notifyDataSetChanged();
} catch (Exception e) {
e.printStackTrace();
}
// System.out.println(getEmailsFromLink(listlinks.get(i)));
}
И сам метод:
private String getEmailsFromLink (String linkemail) throws IOException {
String nnn="";
if (linkemail.contains("vakansii")){
Document doc1 = Jsoup.connect(linkemail).data("query", "Java").userAgent("Mozilla").cookie("auth", "token").timeout(0).get();
Pattern p = Pattern.compile("[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\\.[a-zA-Z0-9-.]+");
Matcher matcher = p.matcher(doc1.text());
HashSet emails = new HashSet();
while(matcher.find()) {
emails.add(matcher.group());
nnn= nnn + matcher.group()+"\n";
}
System.out.println(getEmailsFromLink(nnn));}
return nnn;
}
Ответы (1 шт):
У вас не в try-catch дело а в том, что вы намертво замораживаете главный поток, пока сетевой запрос не отработает. Так делать ни в коем случае нельзя. Хотя бы потому, что при медленном интернете, если запрос не отработает за 5с система выведет юзеру сообщение о том, что приложение зависло. После нескольких таких случаев система даже может предложить приложение удалить а в магазине приложений оно будет в самом низу списка аналогов, т.к. алгоритмы магазинов это учитывают.
Вот как такую задачу можно было бы решить в реальном боевом проекте:
- Сетевой запрос делать через OkHttp. Эта библиотека позволяет получать результат запроса асинхронно: Как отправить GET-запрос на Android?
- Полученный от сервера ответ уже обработать через JSOUP
Также надо иметь в виду, что внутренняя логика адаптера асинхронна