我在做用户登录的过程中出现了一些小小的问题:
在输入用户名密码之后点击登录按钮之后调用doInBackground(void…params)函数进行耗时的后台操作,访问数据库等一系列活动,使用了一个内部类去完成。发现这个时候主线程会fork一个子线程出来去完成查询数据库的操作,然而主线程并没有被阻塞而是继续执行,返回一个结果给onPostExecute(final Boolean XXX)函数。这个时候返回的结果并不是正确的也就是会造成用户名密码匹配仍然登录不上的问题。针对这一问题我展开了思考,一开始 觉得是不是要分配锁~来解决线程阻塞问题,后来想了一想,直接可以用Thread.sleep(2000)来做一个简单的主线程阻塞,等到子线程执行结束返回结果后再结束主线程。
bingo!可行!
protected Boolean doInBackground(Void... params) {
Log.i("record1",""+record);//打印一个控制变量
if(record==false) {//如果点击的是登录按钮
BmobUser.loginByAccount(mEmail, mPassword, new LogInListener<User>() {
@Override
public void done(User user, BmobException e) {
if(user!=null){
bool=true;
Log.i("smile","用户登陆成功"+bool);
}
else bool=false;
}
});
}
if(record==true){//如果点击的是注册按钮
BmobUser bu = new BmobUser();
bu.setUsername(mEmail);//设置用户名
bu.setPassword(mPassword);//设置密码
bu.setEmail(mEmail);//设置联系邮箱
//注意:不能用save方法进行注册
//这里使用bomb后端云数据库,注册的时候用的是邮箱作为用户名,同时邮箱作为用户联系方式
bu.signUp(new SaveListener<User>() {
@Override
public void done(User s, BmobException e) {
if(e==null){
Toast.makeText(getApplicationContext(),"注册成功",Toast.LENGTH_SHORT).show();
bool=false;
Log.i("bool1", "" + bool);
}else{
Toast.makeText(getApplicationContext(),"注册失败"+e.getMessage(),Toast.LENGTH_LONG).show();
bool=false;
}
}
});
//这里做的是发送验证邮件的工作,不被验证时不能登录
BmobUser.requestEmailVerify(mEmail, new UpdateListener() {
@Override
public void done(BmobException e) {
if(e==null){
Log.i("memail",""+mEmail);
Toast.makeText(getApplicationContext(),"请求验证邮件成功,请到" + mEmail + "邮箱中进行激活。",Toast.LENGTH_SHORT).show();
}else{
Log.i("memail",""+mEmail);
Log.i("e:",""+e.getMessage());
Toast.makeText(getApplicationContext(),"发送失败:" + e.getMessage(),Toast.LENGTH_LONG).show();
}
}
});
}
//这里做的是一个简单的阻塞主线程操作
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
return bool;
}