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

时间:2017-01-16 04:41:44

标签: android android-studio android-asynctask retrofit progressdialog

我有一个很长的过程,用于将所选图像从库转换为字节数组,并使用它来构建模型类,并将此模型类设置为与原始请求主体一样的改进。由于图像转换需要一些时间,以及改装请求,因此显示进度对话框将始终以崩溃结束。

   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();
    }

每当错误显示窗口泄露以及无法在中创建looper时,这里我将在onpreexecute方法中显示进度对话框,然后它也会发生。  如何解决这个问题?

1 个答案:

答案 0 :(得分:2)

首先要注意的是,不要运行&#34; Retrofit&#34;代码在&#34; AsyncTask &#34;内,因为 Retrofit 在其自己的后台线程上运行。 因此,每次在#34; AsyncTask &#34;中运行它时,&#34; AsyncTask &#34;将在改造完成执行之前完成。

其次,初始化&#34; ProgressDialog &#34;在 Retrofit 代码之外并启动它。然后,在响应回调方法中,忽略&#34; ProgressDialog &#34;。 就是这样。