1

在我的自定义中,DialogPreferenceonClick使用View.onClickListener执行AsyncTask. 我的班级大致是这样的:

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这是在文档中,并在线程规则的第 4 行下明确说明

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

这就是你的问题。

AsyncTask应该使用该execute()方法开始。

您可以在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通过创建LoginTask类的实例来调用:

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

您应该调用 AsyncTask.execute 方法。永远不要自己调用 doInBackground,它会被自动调用。

于 2013-09-12T18:31:12.097 回答
0

因为你只是调用doInBackgroundAsyncTask 的函数,这是错误的

像这样调用异步任务

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

这样,首先你的 onPreExecute() 将在 DIB 之前被调用,当 DIB 完成时,它的任务onPostExecute将被调用。

于 2013-09-12T18:33:55.750 回答