使用progressdialog和处理程序

时间:2012-02-07 16:19:58

标签: java android handler progressdialog

我正在开发一个连接到网页的应用来获取一些内容。我想展示一个progressdialog,但我认为我做错了。

这是我的代码:

        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只在我想要的操作结束时显示一秒钟。我认为progressdialog仅在执行dismiss()时执行,因为它出现并且很快消失。就像progressdialog只出现消失...请帮助我!!!我已经阅读了很多教程,我尝试了很多选项,比如THREAD而不是HANDLER,但它对我没用,因为我必须编辑UI。

4 个答案:

答案 0 :(得分:2)

这里有一个很好的例子和教程:

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

这是我第一次在Android中使用线程对话框时使用的,我将它添加为书签。希望它有所帮助。

答案 1 :(得分:1)

您获得所描述行为的原因是post方法将仅针对runnable所附加的线程执行传入Handler。在你的情况下,这是UI线程。

您正在调用ProgressDialog.show(),这是异步的。一旦方法返回,这实际上不会显示对话框,而是刚刚请求UI显示对话框。然后立即post一个休眠2秒的线程,该线程被添加到UI队列并阻止UI执行对话show。然后UI从睡眠中唤醒,显示对话框然后被解除。

您应该在新的ThreadAsyncTask中执行任何网络操作。有关更多详细信息,请查看这些链接:

答案 2 :(得分:0)

您不希望每个人使用单独的线程。你真正想要的是AsynTask。这将允许您创建进度对话框并在任务中执行后台处理。编写简单,易于实现。如果您参考该链接,您所需要的实际上与您的问题非常相似。稍微调整一下,它应该对你有用。

答案 3 :(得分:0)

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;
    }
}