My MainActivity вызывает HandleWebPage.init(), чтобы загрузить и проанализировать ссылку на веб-страницу. После вызова init() я получаю набор строк (3 строки). Каждая строка отображается в отдельном фрагменте (первый фрагмент по умолчанию с первой строкой). Другие фрагменты можно выбрать с помощью навигационного ящика.показать значок загрузки при обработке веб-страницы
Проблема. Я пытаюсь добавить диалог прогресса, который должен показывать значок загрузки (вращающийся круг) до тех пор, пока не будет обработано Handle Webpage.init().
Функция init() внутренне вызывает 2 задачи async; Один для загрузки веб-страницы, а второй - для обработки веб-страницы с помощью jsoup для получения над строками.
Как добавить диалог прогресса, чтобы функция init() обрабатывалась и возвращалась в MainActivity?
Я попытался добавить init() в AsyncTask и поставить диалог выполнения в onPreExecution и т. Д., Не работал. Также попытался создать progressdialog.show(), затем создать поток и запустить и вызвал init() не получилось. Я хотел бы знать, что будет правильным решением. Ниже приведен фрагмент кода.
MainActivity.java /// ------------snip
if(savedInstanceState == null) {
updateYearMonthDay(); //gets year, month, day
//hwp is instance of HandleWebPage class
// hwp.init() internally downloads a webpage and process
// This takes some time and I require to show some progress around this
hwp.init(year, month, day);
// after complete i get 3 strings which is processed further in below function
updateMetaData();
// this show first fragment with fist string in text view.
SelectItem(0);
}
HandleWebPage.java
--------------------
public void init()
{
doc = downloadPage();
if (doc != null) {
extractlinks(doc);
}
// some other function which uses AsyncTask as
String = new getmoreInfo().execute(dataString1).get();
}
public Document downloadPage()
{
try {
doc = new getWebPage().execute(urlString).get();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (ExecutionException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return doc;
}
public class getWebPage extends AsyncTask<String, Document , Document> {
@Override
protected void onPreExecute() {
}
@Override
protected Document doInBackground(String... params) {
try {
doc = Jsoup.connect(params[0]).timeout(0).get();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
if(doc == null) {
return null;
} else
return doc;
}
@Override
protected void onPostExecute(Document doc1) {
super.onPostExecute(doc1);
}
};
public void extractLinks(Document doc)
{
// code to process doc using jsoup and update respective String in this class.
}
спасибо. Вы имеете в виду, мне нужно создать AsyncTask в MainActivity и переместить hwp.init() в doInbackground() из этого и показать диалог выполнения в onPreExecute() и отклонить его onPostExecute() ??. Это означает вызов AsyncTask From MainActivity, где doInBackground(), который внутренне вызывает другую AsyncTask (через hwp.init()) правильно ..? –
Да, за исключением того, что вам не нужно вызывать другую AsyncTask из doInBackground первой AsyncTask - вы можете удалить AsyncTask из метода init() – Price
Спасибо. Я попробую это и посмотрю, получаю ли я ожидаемый результат –