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开发:实时处理摄像头预览帧视频--浅析PreviewCallback,onPreviewFrame,AsyncTask的综合应用

Camera.PreviewCallback:定义了onPreviewFrame(byte[] data, Camera camera) 方法,当存在预览帧(preview frame)时调用该方法。...

Android开发:实时处理摄像头预览帧视频------浅析PreviewCallback,onPreviewFrame,AsyncTask的综合应用(转)

原文地址:http://blog.csdn.net/yanzi1225627/article/details/8605061# 很多时候,android摄像头模块不仅预览,拍照这么简单,而是需要在预...

Android AsyncTask 原理浅析

一张图说明AsyncTask的机制原理

Android开发:实时处理摄像头预览帧视频------浅析PreviewCallback,onPreviewFrame,AsyncTask的综合应用

很多时候,android摄像头模块不仅预览,拍照这么简单,而是需要在预览视频的时候,能够做出一些检测,比如最常见的人脸检测。在未按下拍照按钮前,就检测出人脸然后矩形框标示出来,再按拍照。那么如何获得预...

android 多线程异步类asynctask 浅析

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

浅析Android中AsyncTask的使用

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

Android开发:实时处理摄像头预览帧视频------浅析PreviewCallback,onPreviewFrame,AsyncTask的综合应用

很多时候,android摄像头模块不仅预览,拍照这么简单,而是需要在预览视频的时候,能够做出一些检测,比如最常见的人脸检测。在未按下拍照按钮前,就检测出人脸然后矩形框标示出来,再按拍照。那么如何获得预...

解决android中Asynctask遇到的问题

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

Pro Android学习笔记(九六):AsyncTask(5):横竖屏切换问题

文章转载只能用于非商业性质,且不能带有虚拟货币、积分、注册等附加条件。转载须注明出处:http://blog.csdn.net/flowingflying/ 横竖屏切换的问题 在设备转动,进行横竖...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:android AsyncTask问题浅析
举报原因:
原因补充:

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