Android: ProgressDialog не показывает

Я пытаюсь создать ProgressDialog для Android-приложения (просто простое, показывающее пользователю, что происходит, без кнопок или чего-то еще), но я не могу сделать это правильно. Я прошел через форумы и учебники, а также Sample-Code, который поставляется с SDK, но безрезультатно.

Вот что я получил:

    btnSubmit.setOnClickListener(new View.OnClickListener() {
      public void onClick(View view) {
        (...)
          ProgressDialog pd = new ProgressDialog(MyApp.this);
          pd.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
          pd.setMessage("Working...");
          pd.setIndeterminate(true);
          pd.setCancelable(false);

          // now fetch the results
          (...long time calculations here...)

          // remove progress dialog
          pd.dismiss();

Я также попытался добавить pd.show(); и возиться с параметром в new ProgressDialog ничего не получится (кроме ошибок, из-за которых выбранный параметр не будет работать), что означает: ProgressDialog никогда не будет отображаться. Приложение просто продолжает работать, как будто я никогда не добавлял диалог.

Я не знаю, создаю ли я диалог в нужном месте, я немного его передвинул, но это тоже не помогло. Может я не в том контексте? Код выше находится внутри private ViewGroup _createInputForm() в MyApp,

Любая подсказка ценится,

4 ответа

Решение

Вы должны вызвать pd.show до того, как начнутся длинные вычисления, а затем вычисления должны выполняться в отдельном потоке. Как только этот поток завершится, вы должны вызвать pd.dismiss(), чтобы закрыть диалоговое окно prgoress.

здесь вы можете увидеть пример:

ProgressDialog создается и отображается, и вызывается поток для выполнения сложных вычислений:

@Override
    public void onClick(View v) {
       pd = ProgressDialog.show(lexs, "Search", "Searching...", true, false);
       Search search = new Search(   ...   );
       SearchThread searchThread = new SearchThread(search);
       searchThread.start();
    }

а тут нить

private class SearchThread extends Thread {

        private Search search;

        public SearchThread(Search search) {
            this.search = search;
        }

        @Override
        public void run() {         
            search.search();
            handler.sendEmptyMessage(0);
        }

        private Handler handler = new Handler() {

            @Override
            public void handleMessage(Message msg) {
                displaySearchResults(search);
                pd.dismiss();
            }
        };
    }

Я даю вам решение для этого, попробуйте это... Сначала определите диалог прогресса в действии, прежде чем onCreate() метод

private ProgressDialog progressDialog;

Сейчас в onCreate В этом случае вы можете нажать кнопку "Любой", чтобы изменить действие для любого действия. Просто установите там индикатор выполнения.

progressDialog = ProgressDialog.show(FoodDriveModule.this, "", "Loading...");

Теперь используйте нить, чтобы обрабатывать индикатор выполнения для отображения и скрытия

new Thread() 
{
    public void run() 
   {
       try
       {
           sleep(1500); 
           // do the background process or any work that takes time to see progress dialog
       }
       catch (Exception e)
       {
           Log.e("tag",e.getMessage());
       }
       // dismiss the progress dialog   
       progressDialog.dismiss();
    }
}.start();

Это все!

Диалог прогресса не отображается, потому что вы должны использовать отдельный поток. Лучшая практика в Android - использовать AsyncTask (настоятельно рекомендуется). Смотрите также этот ответ.

Это также возможно с помощью AsyncTask. Этот класс создает поток для вас. Вы должны разделить его на подклассы и заполнить doInBackground(...) метод.

Другие вопросы по тегам