Индикатор выполнения на Android отображается после полного выполнения onClick()
У меня есть кнопка, и после ее нажатия onClick() обработает запрос пользователя. Тем не менее, это занимает немного времени, поэтому я хотел бы иметь представление, показывающее "Пожалуйста, подождите, обработка..." сразу после нажатия этой кнопки, в то время как его OnClickListener делает свое дело.
Моя проблема в том, что это "Пожалуйста, подождите, обработка...", которое я поместил в самом начале onClick(), появляется только ПОСЛЕ того, как завершается onClick(). Другими словами, после того, как вся обработка сделана. Итак, мне было интересно, как мне сделать вид, говорящий "Пожалуйста, подождите, обработка...", прежде чем фактическая обработка начнется?
6 ответов
Вы можете сделать это, просто используя AsyncTask, ничего не делая.
Сначала создайте новый класс AsyncTask в пользовательском интерфейсе "onPreExecute", чтобы показать, что вы обрабатываете
Во-вторых, выполняйте всю бэкэнд-трудоемкую работу на "doInBackground"
метод (не вызывайте метод обновления пользовательского интерфейса здесь)В-третьих, измените свой интерфейс, чтобы показать, что процесс завершен или что вы хотите сделать.
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 }}
Как указал @Blundell, вы можете обрабатывать длительные операции в отдельном потоке, чтобы избежать зависания потока пользовательского интерфейса. Однако в Android есть лучшая альтернатива для общего назначения. Handler
который называется AsyncTask
, Пожалуйста, обратитесь к этому руководству для деталей.
Поместите ваш код внутри потока и используйте диалог прогресса...
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..
Выполните обработку в другом потоке, чтобы пользовательский интерфейс мог показать ваш диалог.
// 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
}
};
Вам нужно что-то вроде этого
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);
}
AsyncTasks.
- Поместите отображение диалога прогресса в onPreExecute
- Делай свое дело в doInBackground
- Обновите все, что необходимо обновить в пользовательском интерфейсе, и закройте диалоговое окно в onPostExecute.