我正在开发我的第一个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。我做错了什么?
提前感谢你花时间去帮助我。
答案 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()
。如果你让你的子类成为你活动的内部类,你甚至可以使用你所有活动的成员。