ProgressDialog работает, но не отображается на значке (колесе)

#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 ().