我有一个按钮,按下它后,onClick()将处理用户的请求。但是,这需要一点时间,因此我希望在按下此按钮时立即显示“请稍候,正在处理......”,而其OnClickListener会执行其操作。
我的问题是,我在onClick()的最开头放置的“请稍候,处理...”,只有在整个onClick()完成后才出现。换句话说,在整个处理完成之后。所以,我想知道,在实际处理开始之前,如何制作一个视图说“请等待,处理......”?
答案 0 :(得分:1)
正如@Blundell指出的那样,您可以在单独的线程上处理长时间运行的操作,以避免冻结UI线程。但是在Android中,对于通用Handler
而言,它有一个更好的选择,称为AsyncTask
。有关详细信息,请参阅this教程。
答案 1 :(得分:1)
你可以通过使用AsyncTask而不做任何其他事情来做到这一点。
首先在“onPreExecute”上创建新的AsyncTask类,将ui更改为show 你正在处理......
其次,在“doInBackground”上完成所有后端耗时的工作 方法(不要从这里调用任何ui更新方法)
第三次更改您的ui以显示该过程已完成或您的任何内容 想做。
yourUiButton.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
new NewTask().execute();
}
});
class NewTask extends AsyncTask<String, Void, Task>{
@Override
protected void onPreExecute() {
super.onPreExecute();
//this part runs on ui thread
//show your "wait while processing" view
}
@Override
protected Task doInBackground(String... arg0) {
//do your processing job here
//this part is not running on ui thread
return task;
}
@Override
protected void onPostExecute(Task result) {
super.onPostExecute(result);
//this part runs on ui thread
//run after your long process finished
//do whatever you want here like updating ui components
}}
答案 2 :(得分:0)
在另一个线程上进行处理,以便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();
}
}
处理完成后,您需要回调UI线程以关闭oyur对话框。
Handler handler = new Handler(){
public void handleMessage(int what){
// dismiss your dialog
}
};
答案 3 :(得分:0)
AsyncTasks。
答案 4 :(得分:0)
你需要这样的东西
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中运行(因为它是一项密集型任务,我不建议这样做)
public void onClick(View v){
//show message "Please wait, processing..."
Runnable action = new Runnable(){
@Override
public void run(){
//Do everything you need
}
};
v.post(action);
}
答案 5 :(得分:0)
将你的代码放在一个线程中并在那里使用进度对话......
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..