@sur-pavel

Как передать строку из AssyncTask в метод?

Всем доброго времени суток :)
В android приложении, использующем шаблон Tabbed activity, в модели добавил код для поиска в Гугле, который требует ассинхронного выполнения
public class PageViewModel extends ViewModel {

    private MutableLiveData<Integer> mIndex = new MutableLiveData<>();
    private LiveData<String> mText = Transformations.map(mIndex, new Function<Integer, String>() {
        @Override
        public String apply(Integer input) {
           
           new AsyncSearch().execute("Поисковое слово", "10");
            return ; // что возвратить???
        }
    });

    class AsyncSearch extends AsyncTask<String, Integer, String> {

        @Override
        protected String doInBackground(String... arg) {

            try {
                return GoogleSearchJava.Search(arg[0], arg[1]);

            } catch (IOException e) {
                e.printStackTrace();
                return e.getMessage() + "\n" + e.getStackTrace();
            }
        }

        @Override
        protected void onPostExecute(String s) {
            super.onPostExecute(s);
            //что здесь написать???
        }
    }
}


Как получить строку из onPostExecute() в apply()?

GoogleSearchJava
public class GoogleSearchJava {

    public static final String GOOGLE_SEARCH_URL = "https://www.google.com/search";

    public static String Search(String searchTerm, String num) throws IOException {

        String searchURL = GOOGLE_SEARCH_URL + "?q=" + searchTerm + "&num=" + num;
        //without proper User-Agent, we will get 403 error
        Document doc = Jsoup.connect(searchURL).userAgent("Mozilla/5.0").get();

        //below will print HTML data, save it to a file and open in browser to compare
        //System.out.println(doc.html());

        //If google search results HTML change the <h3 class="r" to <h3 class="r1"
        //we need to change below accordingly
        Elements results = doc.select("h3.r > a");
        StringBuilder builder = new StringBuilder();
        for (Element result : results) {
            String linkHref = result.attr("href");
            String linkText = result.text();
            builder.append(linkHref + "\n" + linkText);
            System.out.println("Text::" + linkText + ", URL::" + linkHref.substring(6, linkHref.indexOf("&")));
        }
        return builder.toString();
    }
  • Вопрос задан
  • 157 просмотров
Решения вопроса 1
zagayevskiy
@zagayevskiy Куратор тега Java
Android developer at Yandex
До чего убогий API у этой штуки...
Тебе надо написать кастомный LiveData, который будет ходить в поиск, а также использовать switchMap вместо map.
Вот тут доступно описано.
И не надо использовать асинктаски для того, чтобы ходить в сеть...
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы