1

私のカスタムでは、正のボタンのイベントを、を実行するカスタムでDialogPreferenceオーバーライドします。私のクラスはおおよそ次のようになります。onClickView.onClickListenerAsyncTask

public class LoginDialog extends DialogPreference {
    private Context mContext;

    public LoginDialog(Context context, AttributeSet attrs) {
        super(context, attrs);

        mContext = context;
        setDialogLayoutResource(R.layout.login_dialog);
    }

    @Override
    protected void showDialog(Bundle bundle) {
        super.showDialog(bundle);
        Button pos = ((AlertDialog) getDialog()).getButton(DialogInterface.BUTTON_POSITIVE);
        pos.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                ...
                new LoginTask(mContext, LoginDialog.this).doInBackground(user_name, user_password);
            }
        });
    }

    public class LoginTask extends AsyncTask<String, Void, Boolean> {
        private LoginDialog mDialog;
        private Context mContext;

        public LoginTask(Context cx, LoginDialog loginDialog) {
            super();
            mDialog = loginDialog;
            mContext = cx;
        }

        protected void onPreExecute() {
            // this is not called, at least nothing shows up in the logs
        }

        protected Boolean doInBackground(String... params) {
            // this is called
        }

        protected void onPostExecute(Boolean success) {
            // this is not called, at least nothing shows up in the logs
        }
    }
}

onPre/PostExecuteメソッドが呼び出されないのはなぜですか? トーストを表示したり、ログを記録したりしましたが、何も表示されません。doInBackgroundメソッドが呼び出されることを確認しました。

4

5 に答える 5

5
new LoginTask(mContext, LoginDialog.this).doInBackground(user_name, user_password);

doInBackground を呼び出さないでください。代わりに execute() を呼び出してください。

ASyncTaskこれはドキュメントにあり、Threading Rulesの 4 行目の下に明確に記載されています

于 2013-09-12T18:30:08.670 に答える
3
new LoginTask(mContext, LoginDialog.this).doInBackground(user_name, user_password);

ここにあなたの問題があります。

AsyncTaskexecute()メソッドを使用して開始する必要があります。

http://developer.android.com/reference/android/os/AsyncTask.htmlでドキュメントを参照できます。

したがって、あなたの場合、コードは次のようになります。

new LoginTask(mContext, LoginDialog.this).execute(user_name, user_password);

于 2013-09-12T18:30:02.063 に答える
0

AsyncTask.execute メソッドを呼び出す必要があります。doInBackground を自分で呼び出さないでください。自動的に呼び出されます。

于 2013-09-12T18:31:12.097 に答える
0

doInBackground間違っている AsyncTask の関数のみを呼び出しているため

このように非同期タスクを呼び出します

new LoginTask(mContext, LoginDialog.this).execute(params);

このように、最初に onPreExecute() が DIB の前に呼び出され、DIB がタスクを終了すると、そのタスクonPostExecuteが呼び出されます。

于 2013-09-12T18:33:55.750 に答える
0

クラスのインスタンスを次のように作成して呼び出すのではなく、メソッドをAsyncTask呼び出すことから始める必要があります。execute()doInBackgroundLoginTask

new LoginTask(mContext, LoginDialog.this).execute(user_name, user_password);
于 2013-09-12T18:30:27.603 に答える