2013-03-15 18 views
1

我有一个活动是这样的:Android:对话框和AsyncTask - 为什么我得到一个IllegalArgumentException?

public class StudentActivity extends Activity { 
static final int DIALOG_PROGRESS = 0; 

public void btnSyncStudentsClick(View view) { 
    syncStudents(); 
} 

@Override 
protected Dialog onCreateDialog(int id) { 
    Dialog d = null; 
    switch (id) { 
    case DIALOG_PROGRESS: 
     ProgressDialog dialog = new ProgressDialog(this); 
     dialog.setMessage(getText(R.string.txt_refreshing_students)); 
     d = dialog; 
     break; 

    return d; 
} 

private class RefreshStudentTask extends 
     AsyncTask<Void, Integer, AccountRefreshResult> { 

    @Override 
    protected void onPreExecute() { 
     showDialog(DIALOG_PROGRESS); 
    } 

    @Override 
    protected AccountRefreshResult doInBackground(Void... params) { 
     //some network requests 
    } 

    @Override 
    protected void onPostExecute(AccountRefreshResult result) { 
     dismissDialog(DIALOG_PROGRESS);    //this throws an exception 

     //some other stuff 
    } 
} 
} 

由于onPreExecute()中所示的对话框,并onPostExecute(),我不知道为什么被解雇一些用户得到一个例外:

Uncaught exception handled :/ , thread: Thread[main,5,main] 
java.lang.IllegalArgumentException: no dialog with id 0 was ever shown via Activity#showDialog 
    at android.app.Activity.missingDialog(Activity.java:2606) 
    at android.app.Activity.dismissDialog(Activity.java:2591) 
    at pl.mobireg.eparent.activities.StudentActivity$RefreshStudentTask.onPostExecute(StudentActivity.java:390) 
    at pl.mobireg.eparent.activities.StudentActivity$RefreshStudentTask.onPostExecute(StudentActivity.java:364) 
    at android.os.AsyncTask.finish(AsyncTask.java:417) 
    at android.os.AsyncTask.access$300(AsyncTask.java:127) 
    at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:429) 
    at android.os.Handler.dispatchMessage(Handler.java:99) 
    at android.os.Looper.loop(Looper.java:130) 
    at android.app.ActivityThread.main(ActivityThread.java:3691) 
    at java.lang.reflect.Method.invokeNative(Native Method) 
    at java.lang.reflect.Method.invoke(Method.java:507) 
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:912) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:670) 
    at dalvik.system.NativeStart.main(Native Method) 

我不能在我身边复制这个问题,所以它很难调试。

编辑: 活动应该只在纵向模式下运行:

android:screenOrientation="portrait" 
+0

你的对话框显示..?它说它没有显示。我的设备上显示的是 – Pragnani 2013-03-15 17:05:41

+0

。我不知道有问题的设备如何。我只有堆栈跟踪 – kmalmur 2013-03-15 17:07:34

回答

1

您可以通过执行任何启动对话框然后更改方向来重现此操作,因为活动将被重新创建,然后没有对话框。这是处理对话的许多烦恼之一,因此,Google建议您使用DialogFragment,因为它可以为您管理大量边缘案例。

+0

以及活动应该只能在肖像模式下运行(请参阅我编辑的帖子) – kmalmur 2013-03-15 17:20:56

+0

'ProgressDialog'是否可以取消?当您按下后退按钮时会发生什么? – kabuko 2013-03-15 17:22:41

+0

是的,它可以取消,但按'后退'不会复制错误 – kmalmur 2013-03-15 17:32:45

1

你的对话已经被驳回。这是一种中等常见的竞赛条件。只要抓住异常并继续前进,结果也是一样 - 对话消失了。

+0

,但只有一个dismissDialog()调用,它应该总是在showDialog()之后运行。如何解雇? – kmalmur 2013-03-15 17:19:49

+0

导致您的活动重新启动的方向更改(或其他配置更改)将是一种方式(异步任务不会自动取消,因此它会完成,但会处理死对话框)。但是,不管这是不是一个可以忽视的安全的人,你希望对话消失,它就消失了。 – 2013-03-15 17:23:03

相关问题