Всем доброго времени суток :)
В 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();
}