我有一个有趣的问题,我之前从未遇到过编程问题。我有一个onClickListener,它做了很多用户名和密码检查(确保用户名是适当的长度,不采取,等等)。我使用的是MobDB,而且我使用的是一个条件语句,如果用户名已经存在,它会返回一行。问题是监听器会跳过数据库并进行最后检查,如果一切正常,则将新的用户名和密码发布到我的数据库。如何在跳到最后一次检查之前让它等待数据库的响应?
以下是相关代码:
usernamecheck3 = true;
MobDB.getInstance().execute(APP_KEY, null, rd, null, false, new MobDBResponseListener() {
@Override public void mobDBSuccessResponse() {
usernamecheck3 = false;
Log.e("mobdbSuccess:", "success");
}
@Override public void mobDBResponse(Vector<HashMap<String, Object[]>> row) {
}
@Override public void mobDBResponse(String jsonObj) {
/*Log.e("mobdbSuccess:", "jsonObj");
Log.e("mobdbSuccess:", jsonObj);
JSONObject mainObject;
try {
mainObject = new JSONObject(jsonObj);
// need to parse the json object.
} catch (JSONException e1) {
e1.printStackTrace();
} */
}
@Override public void mobDBFileResponse(String fileName, byte[] fileData) {
//get file name with extension and file byte array
}
@Override public void mobDBErrorResponse(Integer errValue, String errMsg) {
usernamecheck3 = false;
Log.e("doesnt", "work");
}
});
if(usernamecheck3 == false){
Toast.makeText(getApplicationContext(), "Username is taken, please choose another", Toast.LENGTH_SHORT).show();
}
基本上检查总是返回true,然后logcat会说mobdbSuccess:success,这应该将Bool设置为false。
感谢。
答案 0 :(得分:0)
MobDBResponseListener正在另一个线程上执行。这里发生的是处理被拆分,而一个线程在进行查询,你添加了监听器的主线程,直接跳到验证。最好的办法是将验证放在MobDBResponse方法的MobDBResponseListener中。 尝试调试代码和调用,Listener可能正在使用异步任务。如果是这样,您可以从响应方法中执行任何操作,因为它将再次在主线程中执行。否则,您应该查看处理线程执行的解决方案,如Handlers