Форум программистов, компьютерный форум CyberForum.ru

Как повесить прогресс диалог секунд на 10? - Android

Восстановить пароль Регистрация
 
Kroshandowski
 Аватар для Kroshandowski
2 / 2 / 0
Регистрация: 05.04.2013
Сообщений: 234
03.01.2015, 17:43     Как повесить прогресс диалог секунд на 10? #1
Здрвствуйте!Нашел код для парсинга данных с сайта через jsoup. Так вот...иногда данные загружаются долго (зависит от скорости моб.интернета) и тогда я подумал повесить как бы прелоадером progressDialog секунд так на 10.
Т.е. диалог должен висеть пока не пройдет 10 сек (за это время думаю данные спарсятся) ну или что-то вроде пока не загрузит тег класса например: "div#blog-stats ul li" ,а потом pd.dismiss();
Вот сам код парсинга:
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.select.Elements;
 
import android.app.Activity;
import android.os.Bundle;
import android.widget.TextView;
 
public class JSoupStudyActivity extends Activity {
 
    // blog url
    static final String BLOG_URL = "http://xjaphx.wordpress.com/";
 
    @Override
    public void onCreate(Bundle savedInstanceState) {
        // set layout view
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
 
        // process
        try {
            ((TextView)findViewById(R.id.tv)).setText(getBlogStats());
        } catch (Exception ex) {
            ((TextView)findViewById(R.id.tv)).setText("Error");
        }
    }
 
    protected String getBlogStats() throws Exception {
        String result = "";
        // get html document structure
        Document document = Jsoup.connect(BLOG_URL).get();
        // selector query
        Elements nodeBlogStats = document.select("div#blog-stats-2 ul li");
        // check results
        if(nodeBlogStats.size() > 0) {
            // get value
            result = nodeBlogStats.get(0).text();
        }
 
        // return
        return result;
    }
}
Сам код рабочий...я проверял. Вот только не знаю,как на его основе впихнуть диалоги,асинхтаксы,бэгроундворкеры и т.д.
Заранее спасибо.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
03.01.2015, 17:43     Как повесить прогресс диалог секунд на 10?
Посмотрите здесь:

Android Как закрыть диалог
Как лучше "повесить" обработчик событий на пункты списка, а потом отлавливать нажатие на них Android
Как можно в progressBar вернуть прогресс нужного потока? Android
Как заставить Activity оставаться открытой, пока в ней отображается диалог? Android
Как обработать диалог? Android
Android Как отобразить в диалог окне информацию с БД о записи, на которую кликнул в ListView?
Android Невозможно повесить на TextView текстовый расурс после загрузки приложения
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
dajver
 Аватар для dajver
406 / 270 / 18
Регистрация: 18.09.2010
Сообщений: 1,106
04.01.2015, 01:40     Как повесить прогресс диалог секунд на 10? #2
Java
1
2
3
4
5
6
7
8
9
10
11
12
ProgressDialog dialog = new ProgressDialog(this);
dialog.setMessage("Loading...");
dialog.show();
Runnable runnable = new Runnable() {
                        @Override
                        public void run() {
                               // выполняем какой то код
                              Thread.sleep(1000); // 1 секунда
                              dialog.dismiss();
                        }
};
new Thread(runnable).start();
Kroshandowski
 Аватар для Kroshandowski
2 / 2 / 0
Регистрация: 05.04.2013
Сообщений: 234
04.01.2015, 03:25  [ТС]     Как повесить прогресс диалог секунд на 10? #3
dajver, Спасибо за ответ. В месте комментария "выполняем какой-то код" там должен быть метод или вообще все содержимое. Я просто не понимаю, где именно должен участвовать код, приведенный вами выше. Т.е. как должен выглядеть весь код в итоге. Я пытался его вставить на угад и при запуске прогресс крутился,а потом приложение выбивало. И в конечном итоге я не знаю как его применить.
dajver
 Аватар для dajver
406 / 270 / 18
Регистрация: 18.09.2010
Сообщений: 1,106
04.01.2015, 12:32     Как повесить прогресс диалог секунд на 10? #4
Как то так. Правда я не компилировал его, если будет падать скиньте лог с ошибкой.
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
public class JSoupStudyActivity extends Activity {
 
    // blog url
    static final String BLOG_URL = "http://xjaphx.wordpress.com/";
    private ProgressDialog dialog;
 
    @Override
    public void onCreate(Bundle savedInstanceState) {
        // set layout view
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        
        dialog = new ProgressDialog(this);
        dialog.setMessage("Loading...");
        dialog.show();
        Runnable runnable = new Runnable() {
            @Override
                public void run() {
                     // process
                    try {
                        ((TextView)findViewById(R.id.tv)).setText(getBlogStats());
                        Thread.sleep(1000); // 1 секунда
                        dialog.dismiss();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    } catch (Exception ex) {
                        ((TextView)findViewById(R.id.tv)).setText("Error");
                    }
                }
        };
        new Thread(runnable).start();
    }
 
    protected String getBlogStats() throws Exception {
        String result = "";
        // get html document structure
        Document document = Jsoup.connect(BLOG_URL).get();
        // selector query
        Elements nodeBlogStats = document.select("div#blog-stats-2 ul li");
        // check results
        if(nodeBlogStats.size() > 0) {
            // get value
            result = nodeBlogStats.get(0).text();
        }
 
        // return
        return result;
    }
}
Kroshandowski
 Аватар для Kroshandowski
2 / 2 / 0
Регистрация: 05.04.2013
Сообщений: 234
04.01.2015, 16:26  [ТС]     Как повесить прогресс диалог секунд на 10? #5
dajver, прога не вылетает,но "Loading" крутится бесконечно,как будто dialog.dismiss(); не срабатывает.
dajver
 Аватар для dajver
406 / 270 / 18
Регистрация: 18.09.2010
Сообщений: 1,106
04.01.2015, 17:10     Как повесить прогресс диалог секунд на 10? #6
Видать таки не срабатывает) вынесите его за пределы try \ catch
Sony17
28 / 28 / 6
Регистрация: 24.05.2013
Сообщений: 157
05.01.2015, 13:00     Как повесить прогресс диалог секунд на 10? #7
И каждый раз пользователь будет ждать по 10 сек, чтобы данные дождаться? Даже если на это уйдет 1-2-3 сек? А если дольше, чем 10 сек? Вы в каком-то месте кода получаете эти данные, вот и закрывайте диалог после той строчки кода.

P.S. про код выше: Вы там с UI работаете в новом потоке, чего делать нельзя. Вся работа с UI должна быть в UI потоке.
Kroshandowski
 Аватар для Kroshandowski
2 / 2 / 0
Регистрация: 05.04.2013
Сообщений: 234
05.01.2015, 21:34  [ТС]     Как повесить прогресс диалог секунд на 10? #8
Sony17, Здравствуйте! Да,я жду пока спарсится числовое значение из класса "div#blog-stats-2 ul li" со страницы сайта. Просто когда инет слабый,кажется что данные вообще не подгружаются и только спустя несколько секунд появляются. Вот я и подумал о progressDialog'e. Только как его повесить на код приведенный ТС не знаю.
Sony17
28 / 28 / 6
Регистрация: 24.05.2013
Сообщений: 157
05.01.2015, 22:13     Как повесить прогресс диалог секунд на 10? #9
Kroshandowski,

Как ни крути, вам парсить страницу нужно в новом потоке, вот и используйте AsyncTask. В методе onPreExecute() вызывайте диалог: пихаете сюда весь код, чтобы показать диалог (show()).

В методе doInBackground() начинайте парсить страницу: сюда пихаете весь код что имеете, который парсит страницу. Здесь никакой работы с UI! Как только получите 'числовое значение из класса "div#blog-stats-2 ul li" со страницы сайта', метод завершает работу и срабатывает метод onPostExecute().

В onPostExecute() методе у Вас уже будет получено 'числовое значение из класса "div#blog-stats-2 ul li" со страницы сайта', так что можно закрывать диалог: dismiss().

И будет диалог открываться/закрываться своевременно. А задавать произвольное время для показа диалога ну совсем-совсем не правильно.
Kroshandowski
 Аватар для Kroshandowski
2 / 2 / 0
Регистрация: 05.04.2013
Сообщений: 234
06.01.2015, 20:25  [ТС]     Как повесить прогресс диалог секунд на 10? #10
dajver, Sony17, всем спасибо за наводки. В итоге сделал вот так и все работает как надо без таймеров, т.е. когда все данные из
Java
1
getBlogStats
загрузились появляются
Java
1
((TextView)findViewById(R.id.tv)).setText(getBlogStats());
Вот код...может кому пригодится.
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
public class JSoupStudyActivity extends Activity {
 
    // blog url
    static final String BLOG_URL = "http://xjaphx.wordpress.com/";
    ProgressDialog progress;
 
    @Override
    public void onCreate(Bundle savedInstanceState) {
        // set layout view
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
 
        progress = ProgressDialog.show(this, "Загрузка данных",
                "Подождите...", true);
 
        new Thread(new Runnable() {
            @Override
            public void run()
            {
                try {
                    getBlogStats();
                } catch (Exception e) {
                    e.printStackTrace();  //To change body of catch statement use File | Settings | File Templates.
                }
 
                runOnUiThread(new Runnable() {
                    @Override
                    public void run()
                    {
                        // process
                        try {
                            ((TextView)findViewById(R.id.tv)).setText(getBlogStats());
                        } catch (Exception ex) {
                            ((TextView)findViewById(R.id.tv)).setText("Error");
                        }
                        progress.dismiss();
                    }
                });
            }
        }).start();
 
     }
 
    protected String getBlogStats() throws Exception {
        String result = "";
        // get html document structure
        Document document = Jsoup.connect(BLOG_URL).get();
        // selector query
        Elements nodeBlogStats = document.select("div#blog-stats-2 ul li");
        // check results
        if(nodeBlogStats.size() > 0) {
            // get value
            result = nodeBlogStats.get(0).text();
        }
 
        // return
        return result;
    }
}
Kroshandowski
 Аватар для Kroshandowski
2 / 2 / 0
Регистрация: 05.04.2013
Сообщений: 234
08.01.2015, 23:40  [ТС]     Как повесить прогресс диалог секунд на 10? #11
Sony17, dajver, Печаль-беда(((На устройстве приложение не хочет рабтать т.е. устройство не может спарсить данные (или не успевает) и срабатывает catch...хотя на эмуляторе все ОК.
Как быть в таких ситуациях?
Заранее спасибо.
dajver
 Аватар для dajver
406 / 270 / 18
Регистрация: 18.09.2010
Сообщений: 1,106
08.01.2015, 23:50     Как повесить прогресс диалог секунд на 10? #12
Код ошибки покажите
Kroshandowski
 Аватар для Kroshandowski
2 / 2 / 0
Регистрация: 05.04.2013
Сообщений: 234
09.01.2015, 01:05  [ТС]     Как повесить прогресс диалог секунд на 10? #13
dajver, там не то чтобы ошибка и выбивает (на телефоне же лог не посмотришь),а просто срабатывает catch
Java
1
2
3
4
5
 try {
                            ((TextView)findViewById(R.id.tv)).setText(getBlogStats());
                        } catch (Exception ex) {
                            ((TextView)findViewById(R.id.tv)).setText("Error");
                        }
И вместо числовых данных (там статистика с сайта парсится) выходит Error прописанный в catch. Просто странно...почему на реальном девайсе не рботает так,как работает на эмуляторе?

P.S. эмулятор у меня Android 2.3,а на телефоне Android 4.4 и в манифесте стоит
Код
<uses-sdk android:minSdkVersion="10"/>
Это так на всякий случай.
dajver
 Аватар для dajver
406 / 270 / 18
Регистрация: 18.09.2010
Сообщений: 1,106
09.01.2015, 02:07     Как повесить прогресс диалог секунд на 10? #14
Не может такого быть что бы не было ошибок, уберите try catch и посмотрите в лог после того как приложение падает.
Sony17
28 / 28 / 6
Регистрация: 24.05.2013
Сообщений: 157
09.01.2015, 12:59     Как повесить прогресс диалог секунд на 10? #15
Java
1
2
3
// Этот код выполняется в UI потоке, причем getBlogStats() работает с сетью. В android 4.xx нельзя работать с сетью в UI потоке.
// От этого приложение и крашится.
((TextView)findViewById(R.id.tv)).setText(getBlogStats());
Kroshandowski
 Аватар для Kroshandowski
2 / 2 / 0
Регистрация: 05.04.2013
Сообщений: 234
11.01.2015, 14:57  [ТС]     Как повесить прогресс диалог секунд на 10? #16
Sony17, выходит,что решение проблемы решит только AsyncTasc?
Sony17
28 / 28 / 6
Регистрация: 24.05.2013
Сообщений: 157
11.01.2015, 16:17     Как повесить прогресс диалог секунд на 10? #17
Kroshandowski, не единственное. Но для данной задачи AsyncTask подходит идеально.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.01.2015, 20:29     Как повесить прогресс диалог секунд на 10?
Еще ссылки по теме:

Прогресс бар в кнопку Android
Диалог как в analog clock Android
Как сделать паузу — запретить нажатие кнопок на 5 секунд? Android
Как передавать динамические данные (координаты GPS) из активити в диалог? Android
Кастомизация прогресс-бара Android

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Kroshandowski
 Аватар для Kroshandowski
2 / 2 / 0
Регистрация: 05.04.2013
Сообщений: 234
11.01.2015, 20:29  [ТС]     Как повесить прогресс диалог секунд на 10? #18
Sony17, Ок...спасибо за все советы)
Yandex
Объявления
11.01.2015, 20:29     Как повесить прогресс диалог секунд на 10?
Ответ Создать тему
Опции темы

Текущее время: 22:06. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru