AsyncTask检查用户输入是否在数据库中?

时间:2013-01-02 21:04:16

标签: android android-asynctask

在需要检查输入是否为vaild时,我遇到了同步AsyncTask结果的问题。

我的应用程序要求用户在EditText中输入一些促销代码。如果促销代码在数据库中,我想将促销代码标记为有效。如果输入的促销代码不在数据库中,则会将其标记为无效。

这是按钮监听器的代码

        // Listens for Add button presses
    addButton.setOnClickListener(new OnClickListener() {
        public void onClick(View v) {
            String promo_code = (String) PromotCodeEditText.getText().toString();

            // Start AsyncTask that will store true or false in checkCodeInDatabase variable
            // depending if PromoCode is in database. We use checkCodeInDatabase in else if check below.
            new CheckCodeDatabase().execute(promo_code);

            // Check if Promo Code that user typed is in database
            // checkCodeInDatabase is false if course is not in database
            if (!checkCodeInDatabase) {
                // Display No code in database alert dialog
                showMsgDialog(getString(R.string.noCodeDBTitle),
                        getString(R.string.noCodeDBMessage));

                courseCodeEditText.setText("");

            } else {
                // Add promo code user typed in EditText
                addCode(promo_code);
            }
        }
    });

我的想法是,当用户按下ADD按钮时,为了添加促销代码,我启动AsyncTask,它对数据库执行查询。 AsyncTask在静态变量checkCodeInDatabase中存储true或false。

这是AsyncTask的代码:

private class CheckCodeDatabase extends AsyncTask<String, Object, Boolean> {

    DataBaseHelper myDbHelper = new DataBaseHelper(MainActivity.this);

    @Override
    protected Boolean doInBackground(String... params)
    {
        try {
            myDbHelper.createDataBase();
        } catch (IOException ioe) {
            throw new Error("Unable to create database");
        }

        try {
            myDbHelper.openDataBase();
        } catch (SQLException sqle) {
            throw sqle;
        }

        // This returns true or false if params[0], which is a promo code,
        // is in in PromoCodes table in database.
        return myDbHelper.checkCourseInDatabase(params[0]);
    }

    @Override
    protected void onPostExecute(Boolean result) {
        // Store true or false in checkCodeInDatabase which is a static variable.
        // This variable will be used to check if code is valid in add button listener.
        checkCodeInDatabase = result;
        myDbHelper.close();
    }

问题:

问题是AsyncTask没有按时将值存储到checkCodeInDatabase变量中。含义,如果在添加按钮侦听器中执行的语句,checkCodeInDatabase的值是旧值,因为AsyncTask没有足够的时间执行数据库查询并在添加按钮侦听器中执行if语句之前更新checkCodeInDatabase变量。

那么,如何使添加按钮侦听器等待AsyncTask更新checkCodeInDatabase,然后执行check check。

提前致谢!

P.S。我是android开发的新手。我在一些关于Android开发的书中读到,应该在AsyncTasks中执行对数据库的任何查询,以避免无响应的应用程序。也许用AsyncTasks实现我想要的东西是不可能的。欢迎任何建议。

1 个答案:

答案 0 :(得分:1)

你应该委托整个

        if (!checkCodeInDatabase) {
            // Display No code in database alert dialog
            showMsgDialog(getString(R.string.noCodeDBTitle),
                    getString(R.string.noCodeDBMessage));

            courseCodeEditText.setText("");

        } else {
            // Add promo code user typed in EditText
            addCode(promo_code);
        }

阻止AsyncTask的onPostExecute。

这样做你确定你已经获取了结果并且你正在ui线程上运行。