Использование progressdialog и обработчика - PullRequest
0 голосов
/ 07 февраля 2012

Я работаю над приложением, которое подключается к веб-странице для получения некоторого контента. Я хочу показать прогрессдиалог, но думаю, что делаю что-то не так.

Это мой код:

        final ProgressDialog myProgressDialog = ProgressDialog.show(WhoisBeyondActivity.this, "Wait...", "Fetching data...", true);
        Handler handler=new Handler();
        handler.post(new Runnable()
            {
                public void run()
                {
                    try {
                        // code to execute
                        Thread.sleep(2000);
                    } catch (Exception e) {

                    }
                    myProgressDialog.dismiss();
                }
            });

Проблема в том, что диалоги выполнения отображаются только одну секунду в конце операции, которую я хочу выполнить. Я думаю, что progressdialog выполняется только тогда, когда я выполняю dismiss (), потому что он появляется и быстро исчезает. Похоже, прогрессиалог появляется только исчезнуть ... помогите мне, пожалуйста! Я прочитал много учебных пособий, и я попробовал много вариантов, таких как THREAD вместо HANDLER, но это бесполезно для меня, потому что я должен редактировать пользовательский интерфейс.

Ответы [ 4 ]

2 голосов
/ 07 февраля 2012

Здесь есть превосходный пример и учебное пособие:

http://www.helloandroid.com/tutorials/using-threads-and-progressdialog

Это то, что я использовал в первый раз, когда я делал многопоточный диалог в Android, и я добавил его в закладки.Надеюсь, это поможет.

1 голос
/ 07 февраля 2012

Причина, по которой вы получаете описанное поведение, состоит в том, что метод post просто выполнит переданный в runnable поток, к которому присоединен Handler. В вашем случае это поток пользовательского интерфейса.

Вы звоните ProgressDialog.show(), что является асинхронным. На самом деле это не показывает диалог, как только метод возвращается, скорее вы только что запросили, чтобы пользовательский интерфейс отобразил диалог. Затем вы немедленно post пропустите поток, который спит в течение 2 секунд, который добавляется в очередь пользовательского интерфейса и блокирует пользовательский интерфейс для выполнения диалога show. Пользовательский интерфейс затем просыпается, показывает диалоговое окно, а затем закрывается.

Вы должны выполнить любую сетевую операцию либо в новом Thread, либо в AsyncTask. Посмотрите эти ссылки для более подробной информации:

0 голосов
/ 07 февраля 2012
public class HelloActivity extends Activity {
    protected static final String TAG = "HelloActivity";
    ProgressDialog myProgressDialog;
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        //
        showDialog(1);
        final Handler handler=new Handler(){
            @Override
            public void handleMessage(Message msg) {
                //update UI here depending on what message is received.
                switch(msg.what){
                case 0:
                    myProgressDialog.dismiss();
                }

                super.handleMessage(msg);
            }

        };
        Thread t = new Thread(){

            public void run(){

                        try {
                            // code to execute
                            Thread.sleep(5000);
                        } catch (Exception e) {

                        }
                        handler.sendEmptyMessage(0);//nothing to send
                    }

        };
        t.start();
    }
    @Override
    protected Dialog onCreateDialog(int id) {
        myProgressDialog = ProgressDialog.show(HelloActivity.this, "Wait...", "Fetching data...", true);
        return myProgressDialog;
    }
}
0 голосов
/ 07 февраля 2012

Вы не хотите использовать отдельный поток для каждого высказывания.То, что вы действительно хотите, это AsynTask .Это позволит вам создать диалоговое окно прогресса и выполнить фоновую обработку прямо в задаче.Просто написать и проще в реализации.Если вы ссылаетесь на ссылку, то, что вам нужно, на самом деле очень похоже на ваш вопрос.С небольшой настройкой он должен работать просто отлично для вас.

...