在AsyncTask期间禁用按钮

时间:2012-02-21 14:04:36

标签: android button android-asynctask

我编写了一个测验应用程序,如果我在AsyncTask中触摸其中一个答案,如果答案是正确的,我将颜色设置为绿色,或者如果它是假的红色。

但现在在AsyncTask运行期间,我可以按下其他按钮,如“更改问题”按钮或另一个答案。然后在AsyncTask完成它的工作之后完成。因此,下一个问题已加载,它会自动回答下一个问题,或者使用其中一个笑话。

我试图设置Butnd(假)按钮,但它们仍然在窃听。

如何防止这种情况?

private void disableOrDisableButtons(boolean boo) {
        buttonAnswer1.setEnabled(boo);
        buttonAnswer2.setEnabled(boo);
        buttonAnswer3.setEnabled(boo);
        buttonAnswer4.setEnabled(boo);
    }

在这里我启动了AsyncTask

disableOrDisableButtons(false);
new PrepareAdapter().execute(null, null, null);

在我的AsyncTask中

@Override
        protected void onPreExecute() {
            disableOrDisableButtons(false);
            if (correctAnswerAtButton != buttonClicked) {
                switch (buttonClicked) {
                case 1:
                    buttonAnswer1.setTextColor(Color.RED);
                    break;
                case 2:
                    buttonAnswer2.setTextColor(Color.RED);
                    break;
                case 3:
                    buttonAnswer3.setTextColor(Color.RED);
                    break;
                case 4:
                    buttonAnswer4.setTextColor(Color.RED);
                    break;
                }
                if (buttonClicked != 0) { // 0.. if second chance joker used
                    wrongAnswer = true;
                }
            }
            switch (correctAnswerAtButton) {
            case 1:
                buttonAnswer1.setTextColor(Color.GREEN);
                return;
            case 2:
                buttonAnswer2.setTextColor(Color.GREEN);
                return;
            case 3:
                buttonAnswer3.setTextColor(Color.GREEN);
                return;
            case 4:
                buttonAnswer4.setTextColor(Color.GREEN);
                return;
            }
        }

4 个答案:

答案 0 :(得分:1)

我想在AsyncTask运行时禁用整个界面,您可以使用以下代码显示对话框:

public abstract class BaseAsyncTask<Param, Result> extends AsyncTask<Param, Void, Result> implements DialogInterface.OnCancelListener {
    private static final String TAG = "BaseAsyncTask";
    private ProgressDialog dialog = null;
    protected Context ctx = null;
    protected Exception exception = null;

    public BaseAsyncTask(Context ctx) {
        this.ctx = ctx;
    }

    @Override
    protected void onPreExecute() {
        dialog = ProgressDialog.show(ctx, WLConstants.MSG_TITLE_LOADING_DIALOG, WLConstants.MSG_LOADING_DIALOG, true);
        dialog.setCancelable(true);
        dialog.setOnCancelListener(this);
        if (ctx instanceof WozzonActivity) {
            ((WozzonActivity) ctx).setCurrentDialog(dialog);
        }
    }

    @Override
    protected Result doInBackground(Param... parameters) {
        try {
            return inBackground(parameters);
        } catch (Exception ex) {
            exception = ex;
            Log.e(TAG, ex.getClass().getName(), ex);
            return null;
        }
    };

    @Override
    protected void onPostExecute(Result result) {
        try {
            dialog.dismiss();
        } catch (Exception ex) {
        }// TODO:
        if (result == null) {
            onException(exception);
        } else {
            onResult(result);
        }
    }

    protected void onException(Exception ex) {
        if (ex != null && ex instanceof WozzonException) {
            Toast.makeText(ctx, ex.getMessage(), Toast.LENGTH_SHORT).show();
        } else {
            Toast.makeText(ctx, WLConstants._ERROR_MSG, Toast.LENGTH_SHORT).show();
        }

    }

    public abstract void onResult(Result result);
    public abstract Result inBackground(Param... parameters) throws Exception;

    @Override
    public void onCancel(DialogInterface theDialog) {
        cancel(true);
    }
}

答案 1 :(得分:0)

您需要使用ASyncTask()的onPreExecute()方法。

答案 2 :(得分:0)

您的问题根本与线程无关。尝试使用setTextColor(#ff0000)和settextColor(#00ff00),而不是settextColor(Color.RED)和setTextColor(Color.GREEN)。

答案 3 :(得分:0)

这是我现在用它来在AsyncTask期间锁定我的屏幕的方式。对我而言,它现在是完美的。希望它可以帮到你。

private class PrepareAdapter extends AsyncTask<Void, Void, Integer>
            implements DialogInterface.OnCancelListener {
        private Dialog dialog = null;

        @Override
        protected void onPreExecute() {
            // To disable the whole screen --> setCancelable(false);
            dialog = new Dialog(WerWeissWasQuizActivity.this, android.R.style.Theme_Translucent_NoTitleBar_Fullscreen);
            dialog.setCancelable(false);
            dialog.show();
        }

        @Override
        protected Integer doInBackground(Void... params) {
            dialog.dismiss();
            return 0;
        }

        @Override
        protected void onPostExecute(Integer result) {
            // TODO Auto-generated method stub
            super.onPostExecute(result);
            //do other stuff...
        }

        @Override
        public void onCancel(DialogInterface dialog) {
            // TODO Auto-generated method stub
            cancel(true);
        }
    }