在需要检查输入是否为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实现我想要的东西是不可能的。欢迎任何建议。
答案 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线程上运行。