Android 如何显示进度对话框以及长时间操作和改装?

Android 如何显示进度对话框以及长时间操作和改装?,android,android-studio,android-asynctask,retrofit,progressdialog,Android,Android Studio,Android Asynctask,Retrofit,Progressdialog,我有一个很长的过程,用于将所选图像从gallery转换为byte array,并使用该过程构建模型类,我将该模型类设置为Reformation作为原始请求主体。由于图像转换和改装请求都需要一些时间,因此显示进度对话框总是以崩溃告终 private class EmailAsync extends AsyncTask<String, String, String> { @Override protected String doInBackground(Strin

我有一个很长的过程,用于将所选图像从gallery转换为byte array,并使用该过程构建模型类,我将该模型类设置为Reformation作为原始请求主体。由于图像转换和改装请求都需要一些时间,因此显示进度对话框总是以崩溃告终

   private class EmailAsync extends AsyncTask<String, String, String> {

    @Override
    protected String doInBackground(String... strings) {
    getBytesFromBitmap(selected.get(i).sdcardPath, i + ""); //here i'll get the image byte arrays

     emaildocumentsList.add(documentsmail);
     emaildocuments.set(emaildocumentsList); //here i'll set the modelclass
 Retrofit retrofitApi = new Retrofit.Builder().addConverterFactory(GsonConverterFactory.create()).client(okHttpClient)
                            .baseUrl(BASE_URL_PROD).build();
                    RetrofitApi requestApi = retrofitApi.create(RetrofitApi.class);
                    String encodedHeader = "Basic " + "d2VzdGxha2VtYXJrZXRpbmc6TFJVN0xiR1pvdDZpMHQ3T3p3UnpsVTRxdkQ2UGRJZjU=";
                    retrofit2.Call<ResponseBody> responseBodyCall = requestApi.EmailAttachUploader(encodedHeader, cookies,emaildocuments);
                    responseBodyCall.enqueue(new Callback<ResponseBody>() {
                        @Override
                        public void onResponse(Call<ResponseBody> call, Response<ResponseBody> response) {
                            progressbuilder.dismiss();
                            if (response != null) {
                                if (response.body() == null) {
                                    //Toast.makeText(MultipleImageSelectGalleryActivity.this, "Exception: {Nullpointer Exception}", Toast.LENGTH_SHORT).show();
                                    setResult(524);
                                    finish();
                                }
       }
          @Override
         public void onFailure(Call<ResponseBody> call, Throwable t) {
                            progressbuilder.dismiss();
                            //Toast.makeText(MultipleImageSelectGalleryActivity.this, "Upload Failed!", Toast.LENGTH_SHORT).show();
                            setResult(524);
                            finish();
                        }
                    });
}
 @Override
    protected void onPreExecute() {
        super.onPreExecute();
        progressbuilder.show();
    }
私有类EmailAsync扩展了AsyncTask{
@凌驾
受保护的字符串背景(字符串…字符串){
getBytesFromBitmap(selected.get(i).sdcardPath,i+“”);//这里我将获取图像字节数组
emaildocumentsList.add(documentsmail);
emaildocuments.set(emaildocumentsList);//在这里我将设置modelclass
改装改装API=新改装.Builder().addConverterFactory(GsonConverterFactory.create()).client(okHttpClient)
.baseUrl(BASE_URL_PROD).build();
RefundationAPI requestApi=RefundationAPI.create(RefundationAPI.class);
字符串encodedHeader=“Basic”+”d2VzdGxha2VtYXJrZXRpbmc6TFJVN0xiR1pvdDZpMHQ3T3p3UnpsVTRxdkQ2UGRJZjU=“;
改装2.Call-responseBodyCall=requestApi.EmailAttachUploader(编码头、cookies、emaildocuments);
enqueue(新的回调函数(){
@凌驾
公共void onResponse(调用、响应){
progressbuilder.disclose();
if(响应!=null){
if(response.body()==null){
//Toast.makeText(MultipleImageSelectGalleryActivity.this,“异常:{Nullpointer Exception}”,Toast.LENGTH_SHORT.show();
setResult(524);
完成();
}
}
@凌驾
失败时公共无效(调用调用,可丢弃的t){
progressbuilder.disclose();
//Toast.makeText(MultipleImageSelectGalleryActivity.this,“上载失败!”,Toast.LENGTH\u SHORT.show();
setResult(524);
完成();
}
});
}
@凌驾
受保护的void onPreExecute(){
super.onPreExecute();
progressbuilder.show();
}
每次错误显示窗口泄漏以及无法在内部创建活套,我在这里显示onpreexecute方法中的进度对话框,然后它也会发生。
如何解决此问题?

首先要注意的是,不要在“AsyncTask”中运行“Reformation”代码,因为Reformation在它自己的后台线程上运行。 因此,每次在“AsyncTask”中运行它时,“AsyncTask”将在改造完成执行之前完成

其次,在改造代码外初始化“ProgressDialog”并启动它。然后,在响应回调方法中关闭“ProgressDialog”。
就是这样。

首先要注意的是,不要在“AsyncTask”中运行“Reformation”代码,因为Reformation在它自己的后台线程上运行。 因此,每次在“AsyncTask”中运行它时,“AsyncTask”将在改造完成执行之前完成

其次,在改造代码外初始化“ProgressDialog”并启动它。然后,在响应回调方法中关闭“ProgressDialog”。
就是这样。

检查我的答案进度对话框。为什么要使用异步任务进行改装调用?…对于进度对话框,在改装调用之前启动对话框,并在onresponse和onfailure中关闭该对话框。onpreexecute我正在显示进度对话框,因为图像转换是一个很长的过程,我必须等待它完成正在生成模型类。@请检查内部的“我的答案进度”对话框。为什么要使用异步任务进行改装调用?…对于进度对话框,请在改装调用之前启动该对话框,并在onresponse和onfailure中关闭该对话框。onpreexecute我正在显示进度对话框,因为图像转换是一个漫长的过程,我必须等待直到构建模型类完成为止。@Ankushbist您没有看到我正在将图像转换为字节数组,我必须等待该过程完成,以便为改型构建模型类。ohk现在我得到了它。但是如果您正在进行改型,您不需要在这里使用async任务。您可以像创建方法一样执行此操作在这段代码中,您将运行改装调用,并在改装之前添加一些步骤,如启动对话框和将图像转换为字节数组。其余的步骤是关闭对话框,您已经在上面的代码中完成了。您没有看到我正在将图像转换为字节数组,我必须等待该过程完成,以便为其构建模型类吗ohk现在我知道了。但是如果你正在进行改造,你不需要在这里使用异步任务。你可以这样做,比如创建一个方法,在其中运行改造调用,并在改造之前添加一些步骤,比如开始对话框和将图像转换为字节数组。其余的关闭对话框,你已经在上面的代码中完成了