在 AsyncTask 中显示进度对话框

Posted

技术标签:

【中文标题】在 AsyncTask 中显示进度对话框【英文标题】:Showing Progress Dialog in AsyncTask 【发布时间】:2018-04-15 19:40:05 【问题描述】:

您好,我必须在我的异步任务中显示一个进度对话框,我的异步任务是:

  private class UserProfileDialog extends AsyncTask<String, String, String> 

    private String imagePath;
    private String name;
    private String status;
    private String number;
    private Activity activity;
    private ProgressDialog progressDialog;

    public UserProfileDialog(Activity activity) 
        this.activity = activity;
    

    @Override
    protected void onPreExecute() 
        progressDialog = new ProgressDialog(activity);
        progressDialog.setMessage("Please Wait...");
        progressDialog.setCancelable(false);
        progressDialog.show();
        super.onPreExecute();
    

    @Override
    protected String doInBackground(String... params) 
        imagePath = params[0];
        name = params[1];
        status = params[2];
        number = params[3];
        activity.runOnUiThread(new Runnable() 
            @Override
            public void run() 
                try 
                    //show the dialog for dob date picker
                    final Dialog profileDialog = new Dialog(context);
                    profileDialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
                    profileDialog.setContentView(R.layout.profile_dialog_me);

                    TextView title = (TextView) profileDialog.findViewById(R.id.title);
                    title.setTypeface(EasyFonts.robotoBold(context));

                    ImageView imageCloser = (ImageView) profileDialog.findViewById(R.id.imageCloser);
                    final ImageView profilePicture_x = (ImageView) profileDialog.findViewById(R.id.profilePicture);

                    //set the profile picture
                    Bitmap originalBitmap = BitmapFactory.decodeFile(new File(imagePath).getAbsolutePath());
                    originalBitmap = ModifyOrientationUtility.modifyOrientation(originalBitmap, new File(imagePath).getAbsolutePath());
                    Bitmap bitmap = resizeBitmapFitXY(400, 400, originalBitmap);
                    ByteArrayOutputStream stream = new ByteArrayOutputStream();
                    bitmap.compress(Bitmap.CompressFormat.PNG, 100, stream);
                    Glide.with(context)
                            .load(stream.toByteArray())
                            .asBitmap()
                            .diskCacheStrategy(DiskCacheStrategy.NONE)
                            .skipMemoryCache(true)
                            .dontAnimate()
                            .into(new SimpleTarget<Bitmap>() 

                                @Override
                                public void onResourceReady(Bitmap arg0, GlideAnimation<? super Bitmap> arg1) 
                                    // TODO Auto-generated method stub
                                    profilePicture_x.setImageBitmap(arg0);
                                
                            );

                    TextView profileName = (TextView) profileDialog.findViewById(R.id.profileName);
                    profileName.setTypeface(EasyFonts.robotoLight(context));
                    profileName.setText(name);

                    TextView profileNumber = (TextView) profileDialog.findViewById(R.id.profileNumber);
                    profileNumber.setTypeface(EasyFonts.robotoLight(context));
                    profileNumber.setText(number);

                    TextView profileStatus = (TextView) profileDialog.findViewById(R.id.profileStatus);
                    profileStatus.setTypeface(EasyFonts.robotoLight(context));
                    profileStatus.setText(status);
                    //UI Events
                    imageCloser.setOnClickListener(new View.OnClickListener() 
                        @Override
                        public void onClick(View v) 
                            profileDialog.dismiss();
                        
                    );
                    //show the dialog
                    profileDialog.show();
                 catch (Exception exp) 
                    MyMLogger.showMLog("xm", "show profile dialog " + exp.toString(), logFromClass, "showProfileDialog");
                    exp.printStackTrace();
                
            
        );
        return null;
    

    @Override
    protected void onPostExecute(String s) 
        if (progressDialog.isShowing()) 
            progressDialog.dismiss();
        
        super.onPostExecute(s);
    


AsyncTask 正在查找,但当我单击按钮开始我的任务时,它没有显示进度对话框!

但每当我关闭配置文件对话框时,它就会开始向我显示进度对话框(忽略 onPostExecute)。

有人可以解决这个问题吗,我有点困惑为什么会这样!

【问题讨论】:

你为什么在那里使用AsyncTask?无论如何,您都在 UI 线程上运行所有内容。另外,为什么不让 Glide 处理图像大小调整? 问题是我在 RecyclerView Adapter 中显示这个,并且在 Glide 中设置之前我正在修改图像方向! 我相信 Glide 也可以处理旋转。 【参考方案1】:

阅读ProgressDialog

super.onPreExecute(); 应该删除。

@Override
protected void onPreExecute() 
  // super.onPreExecute();
    progressDialog = new ProgressDialog(activity);
    progressDialog.setMessage("Please Wait...");
    progressDialog.setCancelable(false);
    progressDialog.show();


问题

//UI Events
 imageCloser.setOnClickListener(new View.OnClickListener() 
                        @Override
                        public void onClick(View v) 
                            profileDialog.dismiss();
                        
                    );

显示进度指示器和可选文本消息的对话框或 看法。只能同时使用一条短信或一个视图。

为什么在你的 doInBackground 方法中这样做?

【讨论】:

我尝试将其设置为 first 和 last 但仍然没有显示进度对话框! onPreExecute()AsyncTask 中为空。根本不需要调用super 方法。 @TheAngelCat 阅读此行You're running everything on the UI thread anyway. Also, why don't you let Glide handle the image resizing?【参考方案2】:

试试这个,

private ProgressDialog pdia;

 @Override
 protected void onPreExecute() 
 super.onPreExecute();
    pdia = new ProgressDialog(yourContext);
    pdia.setMessage("Loading...");
    pdia.show();    
 

  @Override
 protected void onPostExecute(String result)
 super.onPostExecute(result);
   if(pdia.isShownig)
    pdia.dismiss();
 
 

也检查这个链接, progressDialog in AsyncTask

【讨论】:

以上是关于在 AsyncTask 中显示进度对话框的主要内容,如果未能解决你的问题,请参考以下文章

从 AsyncTask 更新 Activity 中的进度对话框

AsyncTask 内的数据库操作中未出现进度对话框

Android - 在 AsyncTask 执行时显示进度对话框

Android - 仅在 AsyncTask 未完成时单击按钮时显示进度对话框

自定义对话框片段内的进度条 - 如何从 AsyncTask 传递进度?

带有进度对话框取消的 Android AsyncTask