Java 旋转时异步任务中的IllegalArgumentException
我已经成功地在后台发送了一封电子邮件,并在发送电子邮件时向用户显示了一个进度对话框。然而,当用户在对话框打开时翻转屏幕时,我得到一个IllegalArgumentException。我尝试过使用WeakReference对象,但它似乎无法解决问题。这是我的AsyncTask类Java 旋转时异步任务中的IllegalArgumentException,java,android,android-asynctask,Java,Android,Android Asynctask,我已经成功地在后台发送了一封电子邮件,并在发送电子邮件时向用户显示了一个进度对话框。然而,当用户在对话框打开时翻转屏幕时,我得到一个IllegalArgumentException。我尝试过使用WeakReference对象,但它似乎无法解决问题。这是我的AsyncTask类 private class SendMailTask extends AsyncTask<Mail, String, EmailStatusResponce> { private final Weak
private class SendMailTask extends AsyncTask<Mail, String, EmailStatusResponce> {
private final WeakReference<ProgressDialog> weakReference;
public SendMailTask() {
ProgressDialog progressDialog = new ProgressDialog(SendReportActivity.this);
progressDialog.setMessage("Sending...");
progressDialog.setCancelable(false);
progressDialog.show();
weakReference = new WeakReference<>(progressDialog);
}
@Override
protected void onPreExecute() {
super.onPreExecute();
}
@Override
protected EmailStatusResponce doInBackground(Mail... mail) {
return mail[0].send();
}
@Override
protected void onPostExecute(EmailStatusResponce result) {
super.onPostExecute(result);
if (result != null && weakReference != null) {
weakReference.get().dismiss(); // This is where the exception is thrown.
if (result.isSuccess()) {
Intent intent = new Intent(SendReportActivity.this, MainActivity.class);
startActivity(intent);
}
else {}
}
}
私有类SendMailTask扩展了AsyncTask{
私人最终WeakReference WeakReference;
公共SendMailTask(){
ProgressDialog ProgressDialog=新建ProgressDialog(SendReportActivity.this);
progressDialog.setMessage(“发送…”);
progressDialog.setCancelable(假);
progressDialog.show();
weakReference=新的weakReference(progressDialog);
}
@凌驾
受保护的void onPreExecute(){
super.onPreExecute();
}
@凌驾
受保护的EmailStatusResponse doInBackground(邮件…邮件){
返回邮件[0]。发送();
}
@凌驾
受保护的void onPostExecute(EmailStatusResponse结果){
super.onPostExecute(结果);
if(结果!=null&&weakReference!=null){
weakReference.get().disclose();//这是引发异常的地方。
if(result.issucess()){
意向意向=新意向(SendReportActivity.this,MainActivity.class);
星触觉(意向);
}
else{}
}
}
这是个例外
java.lang.IllegalArgumentException:View=com.android.internal.policy.PhoneWindow$DecorView{688d3e2 V.E……R……D 0,0-1026348}未连接到窗口管理器
提前感谢您的帮助
编辑:更多日志
---------坠机开始
12-11 16:22:40.154 1976-1976/com.blazapps.allenfamilymedicine/AndroidRuntime﹕ 致命异常:主
工艺:com.blazapps.allenfamilymedicine,PID:1976
java.lang.IllegalArgumentException:View=com.android.internal.policy.PhoneWindow$DecorView{f89e667 V.E……R……D 0,0-760232}未连接到窗口管理器
位于android.view.WindowManagerGlobal.findViewLocked(WindowManagerGlobal.java:424)
在android.view.WindowManagerGlobal.removeView(WindowManagerGlobal.java:350)
在android.view.WindowManagerImpl.removeViewImmediate(WindowManagerImpl.java:116)中
在android.app.Dialog.dismissDialog(Dialog.java:362)
在android.app.Dialog.disclose(Dialog.java:345)中
位于com.blazapps.allenfamilymedicine.SendReportActivity$SendMailTask.onPostExecute(SendReportActivity.java:168)
位于com.blazapps.allenfamilymedicine.SendReportActivity$SendMailTask.onPostExecute(SendReportActivity.java:138)
位于android.os.AsyncTask.finish(AsyncTask.java:651)
位于android.os.AsyncTask.-wrap1(AsyncTask.java)
位于android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:668)
位于android.os.Handler.dispatchMessage(Handler.java:102)
位于android.os.Looper.loop(Looper.java:148)
位于android.app.ActivityThread.main(ActivityThread.java:5417)
位于java.lang.reflect.Method.invoke(本机方法)
在com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run上(ZygoteInit.java:726)
位于com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
我仍然不知道为什么会抛出异常,但因为我在EmailStatusResponse中保存了大量信息,所以我可以用try-catch来包围异常,如果任务完成,我会得到预期的结果
try {
weakReference.get().dismiss();
} catch (Exception e) {}
如果有人能想出更好的解决方案,我将不胜感激。我讨厌捕捉异常。通常有更好的方法。发布更多日志信息(“原因”部分)我添加了您要求的信息。