2013-03-15 2 views
1

나는이 같은 활동이있어 : 대화 상자가 onPreExecute()에 표시하고 onPostExecute(), 나도 몰라에서 기각안드로이드 : 대화 상자 및 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 
    } 
} 
} 

때문에 일부 사용자는 예외가 이유 :

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

+0

이 표시되지 않는다고 표시됩니다. 문제가있는 장치는 어떨까요. 스택 트레이스 – kmalmur

답변

1

대화 상자를 시작한 다음 아무 것도하지 않고 대화 상자없이 작업을 다시 만들면 방향을 바꿀 수 있습니다. 이것은 대화를 다루는 데있어 많은 귀찮은 일 중 하나이며, 대신 이러한 많은 사례를 관리하기 때문에 DialogFragment을 사용하는 것이 좋습니다.

+0

잘 활동은 세로 모드에서만 실행해야합니다 (내 편집 된 게시물 참조). – kmalmur

+0

'ProgressDialog'을 취소 할 수 있습니까? 잠시 후 뒤로 버튼을 누르면 어떻게됩니까? – kabuko

+0

예 취소 할 수 있지만 '뒤로'를 누르면 버그가 복제되지 않습니다. – kmalmur

1

귀하의 대화가 이미 기각했다. 이것은 보통의 경쟁 조건입니다. 예외를 잡아서 계속 진행하면 결과는 같은 방법으로 대화 상자가 사라집니다.

+0

만 있지만 dismissDialog() 호출은 하나 뿐이며 항상 showDialog() 이후에 실행해야합니다. 어떻게 해산 될 수 있습니까? – kmalmur

+0

방향 변경 (또는 다른 구성 변경)으로 인해 활동이 다시 시작되는 것도 한 가지 방법입니다 (비동기 작업은 자동으로 취소되지 않으므로 완료되지만 죽은 대화 상자를 처리합니다). 하지만 상관없이이 대화 상자는 무시할 수있는 안전한 대화 상자입니다. –

관련 문제