-1

Android 2.2 アプリケーションを開発しましたが、次のエラーが 1 回だけ発生します。

java.lang.IllegalArgumentException: View not attached to window manager

このエラーは、閉じると発生しますProgressDialog。これdialogは上にありAsyncTaskます。これが私のコードです:

private class LoadGatesAsyncTask extends AsyncTask<Void, Void, Boolean>
{
    private Context mContext;
    private ArrayList<Gate> mGatesList;
    private ProgressDialog mLoadingDialog;

    public LoadGatesAsyncTask(Context context)
    {
        this.mContext = context;
        mLoadingDialog = new ProgressDialog(mContext);
        mLoadingDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER);
        mLoadingDialog.setMessage(getString(R.string.msg_loading_gates));
        mLoadingDialog.setCancelable(false);
        mLoadingDialog.show();
    }

    @SuppressWarnings("unchecked")
    @Override
    protected Boolean doInBackground(Void... params)
    {
        Boolean result = false;

        try
        {
            [ ... ]
        }
        catch (Exception ex)
        {
            ex.printStackTrace();
        }
        return result;
    }

    @Override
    protected void onPostExecute(Boolean result)
    {
        super.onPostExecute(result);

        if (result)
        {
            [ ... ]

            mLoadingDialog.dismiss();
        }
        else
        {
            mLoadingDialog.dismiss();
            Toast toast = Toast.makeText(mContext,
                    getString(R.string.msg_error_loading_gates),
                    Toast.LENGTH_SHORT);
            toast.setGravity(Gravity.CENTER, 
                    toast.getXOffset() / 2,
                    toast.getYOffset() / 2);

            toast.show();
        }
    }

}

プログラムでこのエラーを回避するにはどうすればよいですか? そうでない場合に却下しないようにするためにできるチェックはありattached to window managerますか?

4

4 に答える 4

4

OnCreate で LoadGatesAsyncTask をインスタンス化していますか?

その場合は、loadingDialog のインスタンス化をOnPreExecuteコンストラクタではなくに移動します。

于 2012-08-28T14:30:18.787 に答える
2

チェックを追加できます:

if(mLoadingDialog.isShowing()){
   mLoadingDialog.dismiss();
}
于 2012-08-28T14:31:00.830 に答える
2

ProgressDialogin ではなくコンストラクターでこれを初期化していますが、 inを却下しているためonPreExecute()、これは間違っています。同じUI スレッドで行う必要があります。ProgressDialogonPostExecute

オブジェクト - AsynTask を初期化すると、コンストラクターが呼び出されます。あなたのProgressDialog意志が表示されますが.execute()、まだ AsyncTask を呼び出していません! したがって、それを却下しようとすると、コンパイラは別のスレッドにいることになります。

編集:誤解されたステートメントを明確にします。

于 2012-08-28T14:31:39.763 に答える