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的内存泄露问题

AsyncTask是Android提供的一种用于异步处理数据的异步类,使用AsyncTask可以不用直接使用Thread和Handler来处理后台操作。AsyncTask被引入到Android中就被贴...
  • LoveYaozu
  • LoveYaozu
  • 2016年04月25日 22:41
  • 2809

Android常用异步请求AsyncTask的美中不足之处

相信很多的Android开发人员都很喜欢用到AsyncTask(请求服务器API),这种SDK封装好了的请求异步Task,使用起来很方便,但是也有它的不足之处。在开发Android应用的过程中,我们需...
  • u011730649
  • u011730649
  • 2015年02月25日 11:05
  • 2045

AsyncTask的深度优化(内存泄露)

AsyncTask底层虽然是封装了线程和handler,但是不可避免的出现了内存泄露的问题。 直接上代码: package com.bmsh.router.http; import java.l...
  • q908555281
  • q908555281
  • 2015年09月18日 14:22
  • 628

AsyncTask的缺陷和问题

在Android开发中,AsyncTask可以使得用户避免直接使用Thread类和Handler 来处理后台操作,适用于需要异步处理数据并将数据更新到界面上的情况。AsyncTask适用于后台操作只有...
  • goodlixueyong
  • goodlixueyong
  • 2015年05月21日 20:09
  • 17690

AsyncTask 使用和缺陷

一、AsyncTask的基本用法 由于AsyncTask是一个抽象类,所以如果我们想使用它,就必须要创建一个子类去继承它。在继承时我们可以为AsyncTask类指定三个泛型参数,这三个参数的用途如下:...
  • boyupeng
  • boyupeng
  • 2015年10月09日 17:06
  • 12015

AsyncTask优缺点(两种线程池)

AsyncTask两种线程池  http://bbs.51cto.com/thread-1114378-1.html (API 3.0以后): 1.THREAD_POOL_EXECUTOR, ...
  • ai_yong_jie
  • ai_yong_jie
  • 2016年08月04日 10:02
  • 2243

AsyncTask 坑 (三)AsyncTask对象多次执行

经常看到网上有这种面试题目:一个AsyncTask对象能不能被多次执行? 其实,想知道答案,最好的办法就是看文档说明,要是文档说不行那就是不行,行就是行。 如果想知道的更多,那就看代码呗。 ...
  • zj510
  • zj510
  • 2016年05月29日 13:17
  • 1804

Android 并发二三事之AsyncTask

Android 并发第四篇前言:本篇主要详解AsyncTask 的源码,关于 AsyncTask 的源码其实有太多人都写过了。这里为什么还要写, 是因为博主在并发系列中写AsyncTask的源码,是...
  • MyLero
  • MyLero
  • 2016年11月16日 14:17
  • 594

Android面试一天一题(13 Day: AsyncTask)

记得2012年的时候,在MTK公司内部的一个Work Shop上我分享了对AsyncTask的理解,听众都很有兴趣地参与讨论使用AsyncTask的问题所在。因为UI线程阻塞的问题,每一个Androi...
  • prince58
  • prince58
  • 2016年06月30日 23:56
  • 842

关于AsyncTask<Params, Progress, Result>中三个参数的理解

public abstract class AsyncTask { 在使用AsyncTask时,要指定这三个泛型参数,三种泛型类型分别代表“启动任务执行的输入参数”、“后台任务执行的进度”、“后台计...
  • csd54496
  • csd54496
  • 2015年05月19日 19:01
  • 1583
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:android AsyncTask问题浅析
举报原因:
原因补充:

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