#android
#Android
Вопрос:
Я использую простой ProgressDialog, который работает нормально, но колесо не запускается:
//Progress Dialog
final ProgressDialog dialog = ProgressDialog.show(TravelPharm.this, "Searching","Please wait ...", true);
((ProgressDialog) dialog)
.setProgressStyle(ProgressDialog.BUTTON_NEUTRAL);
final Handler handler = new Handler() {
public void handleMessage(Message msg) {
dialog.dismiss();
}
};
Thread checkUpdate = new Thread() {
public void run() {
handler.sendEmptyMessage(0);
}
};
checkUpdate.start();
чего мне не хватает??
Ответ №1:
Создайте свой диалог выполнения следующим образом:
final ProgressDialog progress = new ProgressDialog(context);
добавьте к нему текст / значок:
progress.setTitle("Loading");
progress.setMessage("Loading, please wait");
progress.setIcon(R.drawable.icon);
Покажите это:
progress.show();
Комментарии:
1. я пробую ваше решение, его доза по-прежнему не работает, колесо остается неподвижным
Ответ №2:
Я думаю, вам следует перейти ProgressDialog.STYLE_SPINNER
к ProgressDialog.setProgressStyle()
методу.
Ответ №3:
final ProgressDialog dialog = ProgressDialog.show(TravelPharm.this, "Searching","Please wait ...", true);
Способ создания ProgressDialog правильный — если счетчик не вращается, значит, что-то блокирует ваш поток пользовательского интерфейса.
Из интереса, почему вы используете TravelPharm.this
для контекста вместо this
? Я не уверен, что это причина вашей проблемы, мне просто интересно, почему.
Ответ №4:
Я предполагаю, что вы запускаете трудоемкую задачу из диалогового окна, а затем перехватываете выход потока в своем обработчике, где вы пытаетесь закрыть диалоговое окно. Если возможно, рассмотрите возможность простой отправки пустого сообщения по завершении диалога. Затем в обработчике создайте новую AsyncTask как:
private class MyAsynch extends AsyncTask<String, Void, String>{
protected void onPreExecute() {
resetProgress();
progress.show();
}
@Override
protected String doInBackground(String...strings) { // <== DO NOT TOUCH THE UI VIEW HERE
// TODO Auto-generated method stub
doNonUIStuff();
return someString; // <== return value String result is sent to onPostExecute
}
protected void onPostExecute(String result){
progress.dismiss();
doSomethingWithString(result); // you could launch results dialog here
}
};
protected void onPause() {
super.onPause();
if (asynch != null) {asynch.cancel(true);}
if (progress != null){progress.cancel();}
}
private void resetProgress() { // avoid frozen progress dialog on soft kill
if (progress != null amp;amp; progress.isShowing()){
progress.cancel();
}
progress= new ProgressDialog(this);
progress.setIndeterminate(true);
progress.setMessage("I am thinking.");
}
Вы могли бы вернуть любой тип в onPostExecute, в этом примере я возвращаю строку. Другим подходом было бы запустить второе действие в виде «диалога», используя startActivityForResult создать AsycnTask в onActivityResult.
Другими словами, соберите данные в диалоговом окне или во втором действии, затем в первом действии покажите диалоговое окно выполнения в onPreExecute, выполните трудоемкую задачу в фоновом режиме и отмените диалоговое окно выполнения в onPostExecute.
Я видел замороженный вращающийся шар, отсюда и вызов resetProgress ().