我有一个很长的过程,用于将所选图像从库转换为字节数组,并使用它来构建模型类,并将此模型类设置为与原始请求主体一样的改进。由于图像转换需要一些时间,以及改装请求,因此显示进度对话框将始终以崩溃结束。
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方法中显示进度对话框,然后它也会发生。 如何解决这个问题?
答案 0 :(得分:2)
首先要注意的是,不要运行&#34; Retrofit&#34;代码在&#34; AsyncTask &#34;内,因为 Retrofit 在其自己的后台线程上运行。 因此,每次在#34; AsyncTask &#34;中运行它时,&#34; AsyncTask &#34;将在改造完成执行之前完成。
其次,初始化&#34; ProgressDialog &#34;在 Retrofit 代码之外并启动它。然后,在响应回调方法中,忽略&#34; ProgressDialog &#34;。 就是这样。