Android:如何修复保存图像时进度条显示的延迟

Android:如何修复保存图像时进度条显示的延迟,android,android-progressbar,Android,Android Progressbar,我有一个按钮,单击该按钮时,会将位图保存到目录,然后将保存图像的文件路径传递到另一个活动。但是,在下一个活动开始之前,通常会有大约2秒的延迟(尤其是位图大小较大时)。所以为了让用户知道位图是在2秒钟的等待时间内保存的,我添加了一个进度条,当点击按钮时,进度条就会显示出来。然而,我遇到的问题是,进度条不会在单击按钮时立即显示,而是在下一个活动开始前几毫秒显示。如何使进度条在单击按钮时立即显示 以下是与此问题相关的代码片段: btnNext.setOnClickListener(new View.O

我有一个按钮,单击该按钮时,会将位图保存到目录,然后将保存图像的文件路径传递到另一个活动。但是,在下一个活动开始之前,通常会有大约2秒的延迟(尤其是位图大小较大时)。所以为了让用户知道位图是在2秒钟的等待时间内保存的,我添加了一个进度条,当点击按钮时,进度条就会显示出来。然而,我遇到的问题是,进度条不会在单击按钮时立即显示,而是在下一个活动开始前几毫秒显示。如何使进度条在单击按钮时立即显示

以下是与此问题相关的代码片段:

btnNext.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {

                progBar.setVisibility(View.VISIBLE); // show progress bar

                if (progBar.getVisibility() == View.VISIBLE) { // if progress bar is visible


                    Bitmap cropped_image_bitmap = mCropImageView.getCroppedImage(); // uses android-image-cropper library

                    // Save bitmap to directory by calling SaveImage() located in SaveToDirectory.java class
                    //SaveImage() method returns the filepath of image being saved
                    String saved_img_filepath = SaveToDirectory.SaveImage(getApplicationContext(), cropped_image_bitmap);

                    if (saved_img_filepath != null) {
                        //finish(); // ready to end current activity

                        //following are the steps to pass values from current activity to another activity
                        Intent intent = new Intent(getApplicationContext(), ImgpostActivity.class);
                        intent.putExtra("IMAGE_URI", saved_img_filepath);

                        //start next activity
                        startActivity(intent);
                    }

                }


            }
        });
progBar.setVisibility(View.VISIBLE)

肯定是在UI线程上运行

我猜

位图裁剪图像位图=mCropImageView.getCroppedImage()// 使用android图像裁剪器库

也在UI线程上运行

发生的事情是,当您强制显示进度条视图时,ui重画阶段需要一段时间,在这之前,您已经调用了另一个命令,如getcropedimage,它消耗了所有ui线程进度,这就是为什么您会面临屏幕冻结这样的结果

在我看来,如果我的猜测是正确的,那么解决方案是将“getcropedimage()”移动到辅助线程或匿名线程(AsnycTask),如

newasynctask(){
@凌驾
受保护的void onPreExecute(){
super.onPreExecute();
progBar.setVisibility(View.VISIBLE);
}
@凌驾
受保护的空位背景(空位…空位){
位图裁剪_image_Bitmap=mCropImageView.getcrappedimage();//使用android图像裁剪器库
返回null;
}
@凌驾
受保护的void onPostExecute(void避免){
super.onPostExecute(避免);
progBar.setVisibility(View.GONE);
}
}

请显示您的xml文件好吗?那么这些代码应该放在哪里呢?里面是什么?里面是onClick?谢谢。我对您的代码做了一些修改,为AsyncTask创建了一个单独的类,并从onClick中调用了该类,它成功了。此外,最好将AsyncTask作为类变量,而不是像我那样保持匿名,以防止内存泄漏
new AsyncTask<Void,Void,Void>() {
        @Override
        protected void onPreExecute() {
            super.onPreExecute();
            progBar.setVisibility(View.VISIBLE);
        }

        @Override
        protected Void doInBackground(Void... voids) {
            Bitmap cropped_image_bitmap = mCropImageView.getCroppedImage(); // uses android-image-cropper library
            return null;
        }

        @Override
        protected void onPostExecute(Void aVoid) {
            super.onPostExecute(aVoid);
            progBar.setVisibility(View.GONE);
        }
    }