Мой ProgressDialog не закрывается даже после загрузки представления.

Я хочу показать Progress-Dialog до того, как мое представление будет загружено. Сначала я написал код в onCreate(), но в этом случае диалоговое окно не появляется. Поэтому я написал это в onResume(), но в этом случае он не исчезает даже после загрузки представления. кто-нибудь может сказать, что здесь не так?

              protected void onResume() {
    // TODO Auto-generated method stub

    super.onResume();
    dialog = ProgressDialog.show(this, "", "Please wait...", true); 
    //dialog.cancel();
    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 progressdialog   
     dialog.dismiss();
     }
    }.start();
    citySelected.setText(fetchCity);
    spinner.setSelection(getBG);
}

person Chetna    schedule 25.06.2012    source источник
comment
написать диалог.отклонить(); строка вне кода потока.   -  person Nirali    schedule 25.06.2012
comment
мой ответ может дать вам некоторую логическую часть   -  person Lucifer    schedule 25.06.2012


Ответы (3)


Вы не можете обновить пользовательский интерфейс (который находится в основном UIthread) из других потоков. Если вы хотите выполнить какой-либо запрос в фоновом режиме, вы можете использовать AsyncTask.

В методе onPreExecute покажите диалоговое окно, а onPostExecute вы можете закрыть диалоговое окно.

Если вы хотите использовать Thread, обновите пользовательский интерфейс с помощью обработчиков.

Использование асинхронной задачи

public class MyAsyncTask extends AsyncTask<String, Void, String> {
    ProgressDialog dialog = new ProgressDialog(ActivityName.this);
    @Override
    protected void onPreExecute() {
        dialog.show();
        super.onPreExecute();
    }

    @Override
    protected String doInBackground(String... params) {
        try {
            Thread.sleep(3000);
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return null;
    }

    @Override
    protected void onPostExecute(String result) {
        dialog.dismiss();
        super.onPostExecute(result);
    }

}

В методе Activity onCreate

MyAsyncTask task = new MyAsyncTask();
    task.execute();
person Raghu Nagaraju    schedule 25.06.2012
comment
Я попытался реализовать это, но он приостанавливает экран для того же действия, а затем загружается следующее представление без отображения диалогового окна! - person Chetna; 25.06.2012
comment
если вы хотите начать новое действие после завершения этого, запустите новое действие в методе onPostExecute. Не вызывайте oncreate саму себя. Я думаю, вы вызываете startActivity в onCreate после task.execute(). Поместите его в onPostExecute - person Raghu Nagaraju; 25.06.2012

лучше использовать Asynctask ......... но если вы все еще хотите то же самое или хотите know the solution only тогда можете попробовать

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());
        }




  YourActivity.this.runOnUIThread(new Runnable(){
                         @Override
                         public void run(){
                             // dismiss the progressdialog   
                              dialog.dismiss();
                        });





     }
    }.start();
person Dheeresh Singh    schedule 25.06.2012
comment
Я пытался реализовать это, но все равно это не работает! Диалог не закрывается. - person Chetna; 25.06.2012

Вы можете использовать AsyncTask. Это лучше, чем нить

private class DownloadingProgressTask extends
        AsyncTask<String, Void, Boolean> {

    private ProgressDialog dialog = new ProgressDialog(ShowDescription.this);
    protected void onPreExecute() {
         this.dialog.setMessage("Please wait");
         this.dialog.show();

    }
    protected Boolean doInBackground(final String... args) {
        try {
                downloadFile(b.getString("URL"));
                return true;
        } catch (Exception e) {
                Log.e("tag", "error", e);
                return false;
        }
    }
    @Override
    protected void onPostExecute(final Boolean success) {

         if (dialog.isShowing()) {
         dialog.dismiss();
         }
    }
}
person Nirali    schedule 25.06.2012