线程和ProgressDialog

时间:2011-03-02 17:04:35

标签: android multithreading progressdialog

我正在开发我的第一个Androïd应用程序,当我想显示ProgressDialog以指示正在运行进程时,我遇到了问题。 在我的应用程序中,用户通过按下按钮来触发耗时的任务。当用户按下Button时,将调用我的“OnClickListener”的“OnClick”功能。在这个函数中,这是我目前正在做的事情:

       - creation and configuration of an instance of the ProgressDialog class,
       - creation of a thread dedicated to the time consuming task,
       - attempt to display the ProgressDialog using the "show" method,
       - start of the thread,
       - main Activity suspended (call of the "wait" function)
       - wake up of the main Activity by the thread when it is finished
       - removal of the ProgressDialog by calling the "dismiss" function.

一切正常(长任务的结果是正确的)但是会出现ProgressDialog。我做错了什么?

提前感谢你花时间去帮助我。

2 个答案:

答案 0 :(得分:2)

您不应该将wait()调用到主活动/ UI线程,因为这实际上会冻结包括ProgressDialog在内的UI,因此它没有时间淡入并且永远不会显示。

尝试正确使用多线程:http://developer.android.com/resources/articles/painless-threading.html

final Handler transThreadHandler = new Handler();

public void onClick(View v) {
    // show ProgressDialog...
    new Thread(){
        public void run(){
            // your second thread
            doLargeStuffHere();
            transThreadHandler.post(new Runnable(){public void run(){
                // back in UI thread
                // close ProgressDialog...
            }});
        }
    }.start();
}

答案 1 :(得分:0)

我建议使用AsyncTask,因为它的目的正是处理这类问题。有关如何使用它的说明,请参阅here。请注意,Floern的答案中的链接页面还建议使用AsyncTask

您需要执行以下操作:

  • 子类AsyncTask
  • 覆盖它的onPreExecute()方法以创建并显示ProgressDialog。 (您可以在子类的成员中保留对它的引用)
  • 覆盖它的doInBackground()方法以执行耗时的操作。
  • 覆盖它的onPostExecute()方法以隐藏对话框。
  • 在您的活动中,创建子类的实例并在其上调用execute()

如果你让你的子类成为你活动的内部类,你甚至可以使用你所有活动的成员。