当需要检查输入是否有效时,我在从 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 实现我想要的是不可能的。欢迎任何建议。