0

У меня есть длинный процесс, который используется для преобразования выбранных изображений из галереи в массив байтов и использования этого для построения класса модели, и я устанавливаю этот класс модели для модификации как в качестве необработанного тела запроса. Поскольку преобразование изображения занимает некоторое время, а также запрос на модификацию, показ диалога прогресса всегда заканчивается сбоем.Как показать диалог прогресса вместе с длинной операцией и доработкой?

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

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

+0

проверить этот ответ http://stackoverflow.com/questions/41277575/logging-with-retrofit2-without-okhttp-intercept/41277944#41277944 диалог прогресса внутри. –

+0

Почему вы используете задачу async для переоборудования? ... для диалога прогресса запустите диалог, прежде чем перестраивать вызов и отклонять его в ответ onresponse и onfailure. –

+0

onpreexecute Я показываю диалог прогресса, так как преобразование изображений - это долгий процесс, мне нужно подождать, пока он не закончится для построения класса модели. @AnkushBist –

ответ

2

Прежде всего следует отметить, что, не запускайте «Переоснащение» код внутри «AsyncTask», так как дооснащения работает на своем собственном фоновом потоке. Таким образом, каждый раз, когда вы запускаете его в «AsyncTask», то «AsyncTask» завершится до Модифицированной завершили выполнение.

Во-вторых, инициализировать "ProgressDialog" вне Retrofit код и запустить его. Затем в методе обратного вызова ответа отклоните «ProgressDialog». Вот и все.

+1

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

+0

ohk теперь я получил его. Но вам не нужно использовать async-задачу здесь, если вы работаете с модификацией. вы можете сделать это, например, создать метод, в котором будет выполняться перенастройка вызова, и добавить несколько шагов к этому, прежде чем модифицировать, например, начать диалог и преобразовать образ в массив байтов. И остальное, чтобы отменить диалог, который вы уже сделали, в приведенном выше коде –