Android上的进度条在完成onClick()执行后显示
我有一个按钮,按下它时,onClick()将处理用户的请求。但是,这需要一点时间,所以我希望在按下此按钮后立即显示一个视图“请稍候,正在处理…”,而它的OnClickListener正在执行它的操作Android上的进度条在完成onClick()执行后显示,android,android-widget,android-button,Android,Android Widget,Android Button,我有一个按钮,按下它时,onClick()将处理用户的请求。但是,这需要一点时间,所以我希望在按下此按钮后立即显示一个视图“请稍候,正在处理…”,而它的OnClickListener正在执行它的操作 我的问题是,我放在onClick()开头的“请稍候,正在处理…”只有在整个onClick()完成后才会出现。换句话说,在完成整个处理之后。因此,我想知道,在实际处理开始之前,我如何创建一个视图说“请稍候,正在处理…”?在另一个线程上进行处理,以便UI可以显示您的对话框 // Show dialog
我的问题是,我放在onClick()开头的“请稍候,正在处理…”只有在整个onClick()完成后才会出现。换句话说,在完成整个处理之后。因此,我想知道,在实际处理开始之前,我如何创建一个视图说“请稍候,正在处理…”?在另一个线程上进行处理,以便UI可以显示您的对话框
// Show dialog
// Start a new thread , either like this or with an ASyncTask
new Thread(){
public void run(){
// Do your thang
// inform the UI thread you've finished
handler.sendEmptyMessage();
}
}
Handler handler = new Handler(){
public void handleMessage(int what){
// dismiss your dialog
}
};
处理完成后,您需要回调到UI线程以关闭您的对话框
// Show dialog
// Start a new thread , either like this or with an ASyncTask
new Thread(){
public void run(){
// Do your thang
// inform the UI thread you've finished
handler.sendEmptyMessage();
}
}
Handler handler = new Handler(){
public void handleMessage(int what){
// dismiss your dialog
}
};
正如@Blundell所指出的,您可以在单独的线程上处理长时间运行的操作,以避免冻结UI线程。然而,在Android中,有一种更好的通用
处理程序替代方案,称为。有关详细信息,请参阅教程。异步任务
- 将进度对话框的显示置于onPreExecute中
- 在后台做事
- 更新UI中需要更新的内容,并关闭onPostExecute中的对话框
您将需要这样的东西
public void onClick(View v){
//show message "Please wait, processing..."
Thread temp = new Thread(){
@Override
public void run(){
//Do everything you need
}
};
temp.start();
}
或者,如果希望它在UIThread中运行(因为这是一项密集型任务,我不建议这样做)
您只需使用AsyncTask即可完成此任务,而无需处理任何其他内容
- 首先在“onPreExecute”上创建新的AsyncTask类,将ui更改为显示
你正在处理某事
- 其次,在“doInBackground”上完成所有耗时的后端工作
方法(不要从这里调用任何ui更新方法)
- 第三,更改您的ui,以显示流程已完成或您需要的任何内容
想做什么
yourUiButton.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
new NewTask().execute();
}
}))
class NewTask扩展了异步任务{
@凌驾
受保护的void onPreExecute(){
super.onPreExecute();
//此部分在ui线程上运行
//显示“处理时等待”视图
}
@凌驾
受保护的任务doInBackground(字符串…arg0){
//在这里做处理工作
//此部件未在ui线程上运行
返回任务;
}
@凌驾
受保护的void onPostExecute(任务结果){
super.onPostExecute(结果);
//此部分在ui线程上运行
//在长流程完成后运行
//在这里做任何你想做的事情,比如更新ui组件
}}
将您的代码放在线程中,并在线程中使用进度对话
void fn_longprocess() {
m_ProgressDialog = ProgressDialog.show(this, " Please wait", "..", true);
fn_thread = new Runnable() {
@Override
public void run() {
try {
// do your long process here
runOnUiThread(UI_Thread);//call your ui thread here
}catch (Exception e) {
e.printStackTrace();
}
}
};
Thread thread = new Thread(null, thread1
"thread1");
thread.start();
}
then close your dialogue in the UI thread...hope it helps..
这样的时间密集型任务通常应该用一个。onClick中的长操作是不允许的。这也可以解决不显示对话框的问题,因为任务在后台运行(就像线程一样)