Форум программистов, компьютерный форум, киберфорум
Наши страницы

Программирование Android

Войти
Регистрация
Восстановить пароль
 
 
Kroshandowski
2 / 2 / 0
Регистрация: 05.04.2013
Сообщений: 234
#1

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

03.01.2015, 17:43. Просмотров 850. Ответов 17
Метки нет (Все метки)

Здрвствуйте!Нашел код для парсинга данных с сайта через 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;
    }
}
Сам код рабочий...я проверял. Вот только не знаю,как на его основе впихнуть диалоги,асинхтаксы,бэгроундворкеры и т.д.
Заранее спасибо.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
03.01.2015, 17:43
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Как повесить прогресс диалог секунд на 10? (Программирование Android):

Как повесить запрос пароля на кнопку? - Программирование Android
Добрый день! Подскажите как можно повесить запрос пароля при нажатии кнопки?

Как создать диалог выбора шрифта и диалог выбора цвета - C# WPF
как создать диалог выбора шрифта и диалог выбора цвета в wpf

В этой программе создается "матрица" из секунд.Как мне первый ряд чисел (секунд) присвоить масиву? - C++
//--------------------------------------------------------------------------- #include <vcl.h> #pragma hdrstop #include...

Как повесить hover? - HTML, CSS
Всем привет! Есть блок с фоновым изображением как повесить hover именно на это изображение? div { background:url(); } ...

Как повесить запрос на кнопку? - MS Access
Не следует использовать макросы и Docmd

Как повесить событие на рисунок ? - Python
Помогите разобраться в событии по нажатию на рисунок левой кнопки мыши, должна переменная меняться, как правильно записать ? from tkinter...

17
dajver
410 / 274 / 18
Регистрация: 18.09.2010
Сообщений: 1,114
04.01.2015, 01:40 #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();
0
Kroshandowski
2 / 2 / 0
Регистрация: 05.04.2013
Сообщений: 234
04.01.2015, 03:25  [ТС] #3
dajver, Спасибо за ответ. В месте комментария "выполняем какой-то код" там должен быть метод или вообще все содержимое. Я просто не понимаю, где именно должен участвовать код, приведенный вами выше. Т.е. как должен выглядеть весь код в итоге. Я пытался его вставить на угад и при запуске прогресс крутился,а потом приложение выбивало. И в конечном итоге я не знаю как его применить.
0
dajver
410 / 274 / 18
Регистрация: 18.09.2010
Сообщений: 1,114
04.01.2015, 12:32 #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;
    }
}
1
Kroshandowski
2 / 2 / 0
Регистрация: 05.04.2013
Сообщений: 234
04.01.2015, 16:26  [ТС] #5
dajver, прога не вылетает,но "Loading" крутится бесконечно,как будто dialog.dismiss(); не срабатывает.
0
dajver
410 / 274 / 18
Регистрация: 18.09.2010
Сообщений: 1,114
04.01.2015, 17:10 #6
Видать таки не срабатывает) вынесите его за пределы try \ catch
0
Sony17
28 / 28 / 6
Регистрация: 24.05.2013
Сообщений: 157
05.01.2015, 13:00 #7
И каждый раз пользователь будет ждать по 10 сек, чтобы данные дождаться? Даже если на это уйдет 1-2-3 сек? А если дольше, чем 10 сек? Вы в каком-то месте кода получаете эти данные, вот и закрывайте диалог после той строчки кода.

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

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

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

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

И будет диалог открываться/закрываться своевременно. А задавать произвольное время для показа диалога ну совсем-совсем не правильно.
1
Kroshandowski
2 / 2 / 0
Регистрация: 05.04.2013
Сообщений: 234
06.01.2015, 20:25  [ТС] #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;
    }
}
0
Kroshandowski
2 / 2 / 0
Регистрация: 05.04.2013
Сообщений: 234
08.01.2015, 23:40  [ТС] #11
Sony17, dajver, Печаль-беда(((На устройстве приложение не хочет рабтать т.е. устройство не может спарсить данные (или не успевает) и срабатывает catch...хотя на эмуляторе все ОК.
Как быть в таких ситуациях?
Заранее спасибо.
0
dajver
410 / 274 / 18
Регистрация: 18.09.2010
Сообщений: 1,114
08.01.2015, 23:50 #12
Код ошибки покажите
0
Kroshandowski
2 / 2 / 0
Регистрация: 05.04.2013
Сообщений: 234
09.01.2015, 01:05  [ТС] #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"/>
Это так на всякий случай.
0
dajver
410 / 274 / 18
Регистрация: 18.09.2010
Сообщений: 1,114
09.01.2015, 02:07 #14
Не может такого быть что бы не было ошибок, уберите try catch и посмотрите в лог после того как приложение падает.
0
Sony17
28 / 28 / 6
Регистрация: 24.05.2013
Сообщений: 157
09.01.2015, 12:59 #15
Java
1
2
3
// Этот код выполняется в UI потоке, причем getBlogStats() работает с сетью. В android 4.xx нельзя работать с сетью в UI потоке.
// От этого приложение и крашится.
((TextView)findViewById(R.id.tv)).setText(getBlogStats());
0
09.01.2015, 12:59
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.01.2015, 12:59
Привет! Вот еще темы с ответами:

Как повесить события на текст? - C#
Стала задача: Необходимо сделать чтобы при клике по тексту в RichTextBox (или в чем угодно другом, просто не знаю где можно это...

Как повесить обработчик MouseUp? - C++ Builder FireMonkey
у класса описал метод void __fastcall MainItem::MouseRightClc(TObject *Sender, TShiftState Shift, int X, int Y) { ...

Как повесить событие на option? - JavaScript
При нажатие на add в список добавляется новое строка (В select добавляется новый узел option и значение). Как повесить событие на option...

Как повесить кнопку на функцию - C#
Хочу поставит кнопку на функцию using System; using System.Drawing; using System.ComponentModel; using System.Windows.Forms; ...


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru