android AsyncTask问题浅析

我在做用户登录的过程中出现了一些小小的问题:

在输入用户名密码之后点击登录按钮之后调用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;

        }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值