0

当需要检查输入是否有效时,我在从 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);
            }
        }
    });

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

这是 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 变量中。这意味着,在添加按钮侦听器中执行的 if 语句,checkCodeInDatabase 的值是旧值,因为 AsyncTask 在添加按钮侦听器中执行 if 语句之前没有足够的时间执行数据库查询和更新 checkCodeInDatabase 变量。

那么,如何让添加按钮监听器等待 AsyncTask 更新 checkCodeInDatabase 然后执行 if 检查。

提前致谢!

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

4

1 回答 1

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 线程上运行。

于 2013-01-02T21:11:30.127 回答