Как реализовать Progressdialog здесь?

#android

#Android

Вопрос:

Я сохраняю imae из drawing canvas. Для сохранения на SD-карту требуется несколько секунд. Итак, во время процесса сохранения я хочу показать диалоговое окно, в котором изображение сохраняется…

Итак, как реализовать диалоговое окно прогресса для этого?

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

  case R.id.saveBtn:
            Toast.makeText(getApplicationContext(), "Save", Toast.LENGTH_SHORT).show();
            final Activity currentActivity  = this;
            Handler saveHandler = new Handler(){
                @Override
                public void handleMessage(Message msg) {
                    final AlertDialog alertDialog = new AlertDialog.Builder(currentActivity).create();
                    alertDialog.setTitle("Drawing App");
                    alertDialog.setMessage("Your drawing had been saved :)");
                    alertDialog.setButton("OK", new DialogInterface.OnClickListener() {
                        public void onClick(DialogInterface dialog, int which) {
                            return;
                        }
                    });
                    alertDialog.show();
                }
            } ;

           new ExportBitmapToFile(this,saveHandler, drawingSurface.getBitmap()).execute();

        break;
  

Ответ №1:

Поскольку вы используете AsyncTask ( ExportBitmapToFile ), вы можете вызвать ProgressDialog in preExecute() и отклонить его в postExecute методе. Для этого не Handler требуются s.

Редактировать

 class ExportBitmapToFile extends AsyncTask<...> {
    private ProgressDialog  m_progressDialog = null;
    .... 

    @Override
    protected void onPreExecute(){
        m_progressDialog = new ProgressDialog(m_context);
        m_progressDialog.setMessage("please wait...");
        m_progressDialog.setCancelable(false);
        m_progressDialog.show();
    }

    @Override
    protected void onPostExecute(HashMap<String, String> result){
        m_progressDialog.dismiss();
        //your alert dialog with message to user
        AlertDialog.Builder builder = new AlertDialog.Builder(currentActivity);
            builder.setTitle("Drawing App");
            builder.setMessage("Your drawing had been saved :)");
            builder.setButton("OK", new DialogInterface.OnClickListener() {
                public void onClick(DialogInterface dialog, int which) {
                    dialog.dismiss();
                    return;
                }
            });
        alertDialog = builder.create()
        alertDialog.show();
    } 
}
  

Комментарии:

1. Спасибо за ответ. Итак, в моем коде, где я должен запустить диалоговое окно start progress и где его закрыть?

Ответ №2:

Похоже, что ExportBitmapToFile является AsyncTask, и в этом случае вызывается saveHandler.sendEmptyMessage(0); in onPreExecute() .

Вы также могли бы вызвать savehandler.sendEmptyMessage(1) in onPostExecute() и сделать AlertDialog переменной-членом (а не локальным экземпляром) вашей активности и посмотреть msg.what в вашей handleMessage(Message msg); функции — 0 означает показать диалоговое окно, 1 означает, что диалоговое окно должно быть скрыто. Кроме того, вы можете захотеть очистить диалоговое окно в действиях onStop

Вы также хотите установить все свойства в AlertDialog.Конструктор перед вызовом create() :

 private AlertDialog alertDialog = null; 
    Handler saveHandler = new Handler(){
        @Override
        public void handleMessage(Message msg) {
            if(msg.what == 0 amp;amp; alertDialog != null) {
                AlertDialog.Builder builder = new AlertDialog.Builder(currentActivity);
                builder.setTitle("Drawing App");
                builder.setMessage("Your drawing had been saved :)");
                builder.setButton("OK", new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog, int which) {
                        dialog.dismiss();
                        return;
                    }
                });
                alertDialog = builder.create()
                alertDialog.show();
            }
            else if(alertDialog != null){
                alertDialog.dismiss();
                alertDialog = null;
            }
        }
    } ;
  

Примечание — при этом не отображается индикатор выполнения — вы должны отобразить ProgressDialog при предварительном выполнении, отклонить его, а затем отобразить вышеупомянутый AlertDialog при последующем выполнении (используя ту же технику).

Ответ №3:

Вы должны использовать onPreExecute и onPostExecute в вашем классе ExportBitmapToFile AsyncTask, поэтому вам следует добавить что-то подобное к этому классу.

     @Override
    protected void onPostExecute(Void result) {
        // TODO Auto-generated method stub
        if (progressDialog.isShowing()) {
            progressDialog.dismiss();

        }
        super.onPostExecute(result);
    }



    @Override
    protected void onPreExecute() {

        progressDialog = ProgressDialog.show(context, "Message",
                "Loading");

        super.onPreExecute();

    }