Как мне показать ProgressDialog в потоке пользовательского интерфейса

#android #progressdialog #ui-thread

#Android #progressdialog #пользовательский интерфейс-поток

Вопрос:

Я действительно изо всех сил пытался выяснить, как получить ProgressDialog в потоке пользовательского интерфейса для этого кода, учитывая, что uploadPhoto и был бы признателен за любые рекомендации:

 @Override
    /** Handle Upload a Photo **/
    protected void onActivityResult(int requestCode, int resultCode, Intent imageReturnedIntent) { 
        super.onActivityResult(requestCode, resultCode, imageReturnedIntent); 

        // Get image
        if (resultCode == RESULT_OK) {

            // ProgressDialog dialog = ProgressDialog.show(this, "", "Uploading Photo...", true, false);

            switch(requestCode) { 

                // Take Photo
                case 4001:      
                    // Upload
                    uploadPhoto(Uri.fromFile(mImageFile));
                    break;

                // Select Photo
                case 5001:

                    // Get image 
                    Uri selectedImage = imageReturnedIntent.getData();

                    // Upload
                    uploadPhoto(selectedImage);
                    break;
            }

            // Dismiss
            // dialog.dismiss();            
        }
    }
 

Ответ №1:

Используйте AsyncTask примерно так:

 public class NetworkTask extends AsyncTask<Object , Void, Object> {
    Context context;
    boolean shouldContinue = true;
    public ProgressDialog dialog;
    String waitMessage = "Please wait, loading data...";
    public NetworkTask(Context con){
        this.context = con;     
    }
    public void setMessage(String msg){
        waitMessage = "Please wait, " msg;
    }
    protected void onPreExecute(){
        shouldContinue  = ConnectionUtils.isNetworkAvailable(context);
        if(shouldContinue)
            dialog = ProgressDialog.show(context, null, waitMessage, true);
        else{
            Dialog.showToast(context, Constants.NETWORK_ERROR);
            return;
        }
    }
    @Override
    protected void onPostExecute(Object result){
        if(dialog != null ){
            if(dialog.isShowing())
            dialog.dismiss();
            dialog = null;
        }           
    }
    @Override
    protected Object doInBackground(Object... params){
        //do uploading and other tasks
    }
}
 

и в вашем Activity вызове это так:

 NetWorkTask task = new NetWorkTask(this); //Here you can pass other params
task.execute("");
 

Ответ №2:

использование AsyncTask может быть. поместите функцию загрузки фотографий в фоновый режим асинхронной задачи.

запустите диалоговое окно выполнения в предварительном выполнении.

закрыть / отменить диалоговое окно выполнения после выполнения.

пост-выполнение и предварительное выполнение выполняются в потоке пользовательского интерфейса.

 private class uploadPhoto extends AsyncTask<Void, Void, Void>{

            private ProgressDialog dialog;
        protected void onPostExecute(Void dResult) {

                dialog.cancel();

        }

        protected void onPreExecute() {


            dialog = new ProgressDialog(Myactivity.this);
            dialog.setCancelable(true);
            dialog.setMessage("uploading...");
            dialog.show();

                }

        protected Void doInBackground(Void... params) {
            // call upload photo here.
        }

    }
 

для вызова AsyncTask используйте

 new uploadPhoto().execute();
 

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

1. Я вроде понимаю, о чем вы говорите, но я никогда не делал ничего из этого.

2. хорошо, тогда вам, возможно, придется взглянуть на AsyncTask и как это работает. обычно он используется для экземпляров такого типа. я добавил некоторый код, чтобы вы знали, как это работает.