android AsyncTask问题浅析

原创 2016年08月31日 15:59:53

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

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

        }
版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

浅析android中AsyncTask

作用 android是单线程模型。如果在UI主线程中执行耗时操作。可能导致ANR(应用无响应)。系统就会弹出一个ANR对话框。用户选择等待或者离开应用 注意:ANR出现场景: 主线程被I...

浅析Android中AsyncTask的使用

在Android中实现异步任务机制有两种方式,Handler和AsyncTask。 Handler模式需要为每一个任务创建一个新的线程,任务完成后通过Handler实例向UI线程发送消息,完成界面的...

Android AsyncTask 原理浅析

一张图说明AsyncTask的机制原理

android 多线程异步类asynctask 浅析

android 因为要遵守单线程模型必须在UI线程中更新UI,但是一些耗时的操作又不能放在UI线程中,以免引起UI线程阻塞从而导致的响应慢或者UI显示慢等问题,就需要 把这些耗时的操作放在单独的线程...

android面试问题浅析

  • 2011-08-20 10:02
  • 72KB
  • 下载

Android多线程问题—— AsyncTask机制

Android中,为了实现UI线程和worker线程之间的通信,设计了两种方式:Handler机制和AsyncTask机制。 AsyncTask:异步任务,它是一个多线程编程的框架。从字面上来说,就...

解决android中Asynctask遇到的问题

安卓中,Asynctask使用起来很方便,但也不是很完美,在做项目的时候,用一个ListView加载图片出现了java.util.concurrent.RejectedException这么一个异常信...

Android AsyncTask cannot resolve CalledFromWrongThreadException问题解决方案

Android 在JELLY_BEAN之前的版本调用AsyncTask时,如果首次不是在主线程加载,可能会报如下错误:cannot resolve CalledFromWrongThreadExcep...

Android之AsyncTask的内存泄露问题

AsyncTask是Android提供的一种用于异步处理数据的异步类,使用AsyncTask可以不用直接使用Thread和Handler来处理后台操作。AsyncTask被引入到Android中就被贴...

AsyncTask解决Android UI堵塞问题

转自(http://www.starming.com/index.php?action=plugin&v=wave&tpl=union&ac=viewgrouppost&gid=74&tid=5216...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)