1

私はこのような活動をしています:

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"
4

2 に答える 2

1

ダイアログは既に閉じられています。これは、適度に一般的な競合状態です。例外をキャッチして先に進むだけで、どちらの方法でも結果は同じです。ダイアログは消えます。

于 2013-03-15T17:09:24.813 に答える
1

おそらく、ダイアログを開始するものを何でも実行し、アクティビティがダイアログなしで再作成されるように方向を変更することで、これを再現できます。これは、ダイアログを処理する際の多くの煩わしさの 1 つであり、Google はDialogFragmentこれらのエッジ ケースの多くを管理するため、代わりに使用することを推奨しています。

于 2013-03-15T17:11:22.753 に答える