Java学习者论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

手机号码,快捷登录

恭喜Java学习者论坛(https://www.javaxxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,购买链接:点击进入购买VIP会员
JAVA高级面试进阶视频教程Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程

Go语言视频零基础入门到精通

Java架构师3期(课件+源码)

Java开发全终端实战租房项目视频教程

SpringBoot2.X入门到高级使用教程

大数据培训第六期全套视频教程

深度学习(CNN RNN GAN)算法原理

Java亿级流量电商系统视频教程

互联网架构师视频教程

年薪50万Spark2.0从入门到精通

年薪50万!人工智能学习路线教程

年薪50万!大数据从入门到精通学习路线年薪50万!机器学习入门到精通视频教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程 MySQL入门到精通教程
查看: 575|回复: 0

开发交流:AsyncTask异步方式详解及其使用

[复制链接]

该用户从未签到

发表于 2011-10-24 09:16:17 | 显示全部楼层 |阅读模式
更多请访问我的博客:http://blog.csdn.net/zuolongsnail
在实际应用中经常会遇到比较耗时任务的处理,比如网络连接,数据库操作等情况时,如果这些操作都是放在主线程(UI线程)中,则会造成UI的假死现象,Android中可以使用AsyncTask和Handler两种异步方式来解决这种问题。Handler异步方式详解及其使用

AsyncTask(异步任务处理)
在使用AsyncTask时处理类需要继承AsyncTask,提供三个泛型参数,并且重载AsyncTask的四个方法(至少重载一个)。
三个泛型参数:
1.Param 任务执行器需要的数据类型
2.Progress 后台计算中使用的进度单位数据类型
3.Result 后台计算返回结果的数据类型
在设置参数时通常是这样的:String... params,这表示方法可以有0个或多个此类型参数;有时参数可以设置为不使用,用Void...即可。
四个方法:
1.onPreExecute() 执行预处理,它运行于UI线程,可以为后台任务做一些准备工作,比如绘制一个进度条控件。
2.doInBackground(Params...) 后台进程执行的具体计算在这里实现,doInBackground(Params...)是AsyncTask的关键,此方法必须重载。在这个方法内可以使用publishProgress(Progress...)改变当前的进度值。
3.onProgressUpdate(Progress...) 运行于UI线程。如果在doInBackground(Params...) 中使用了publishProgress(Progress...),就会触发这个方法。在这里可以对进度条控件根据进度值做出具体的响应。
4.onPostExecute(Result) 运行于UI线程,可以对后台任务的结果做出处理,结果就是doInBackground(Params...)的返回值。此方法也要经常重载,如果Result为null表明后台任务没有完成(被取消或者出现异常)。
示例代码如下,完整代码点这里下载。


view plaincopy to clipboardprint?


// AsyncTask异步方式下载图片

class DownImageTask extends AsyncTask<String, Integer, Bitmap> {   
    // 执行预处理

    @Override

    protected
void onPreExecute() {   
        super.onPreExecute();   
        // 显示进度条

        progressBar.setVisibility(View.VISIBLE);   
        progressBar.setMax(100);   
    }   
    // 后台进程的执行

    @Override

    protected Bitmap doInBackground(String... params) {   
        try {   
            URL url = new URL(params[0]);   
            HttpURLConnection conn = (HttpURLConnection) url   
                    .openConnection();   
            InputStream inputStream = conn.getInputStream();   
            bitmap = BitmapFactory.decodeStream(inputStream);   
            // 进度条的更新,我这边只是用一个循环来示范,在实际应用中要使用已下载文件的大小和文件总大小的比例来更新

            for (int i = 1; i <= 10; i++) {   
                publishProgress(i * 10);   
                Thread.sleep(200);   
            }   
            inputStream.close();   
        } catch (Exception e) {   
            e.printStackTrace();   
        }   
        return bitmap;   
    }   
    // 运行于UI线程,对后台任务的结果做出处理,doInBackground方法执行的结果作为此方法的参数

    @Override

    protected
void onPostExecute(Bitmap result) {   
        super.onPostExecute(result);   
        ImageView imageView = (ImageView) findViewById(R.id.image);   
        imageView.setImageBitmap(result);   
        progressBar.setVisibility(View.GONE);   
    }   
    // 运行于UI线程,如果在doInBackground(Params...)中使用了publishProgress(Progress...),就会触发此方法

    @Override

    protected
void onProgressUpdate(Integer... values) {   
        super.onProgressUpdate(values);   
        progressBar.setProgress(values[0]);   
    }   
}  
回复

使用道具 举报

该用户从未签到

发表于 2011-10-24 09:16:20 | 显示全部楼层

Re:开发交

zuolongsnail 的帖子

安卓巴士巴友发帖规范[教你如何把你的帖子规范好]
http://www.apkbus.com/forum.php? ... =1571&fromuid=1


代码发得不好,希望楼主可以好好编辑哈........
回复 支持 反对

使用道具 举报

该用户从未签到

发表于 2011-10-24 09:16:22 | 显示全部楼层

Re:开发交

chino 的帖子

好的,知道了
回复 支持 反对

使用道具 举报

该用户从未签到

发表于 2011-10-24 09:16:25 | 显示全部楼层

Re:开发交

噢耶,学习了哈
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|Java学习者论坛 ( 声明:本站资料整理自互联网,用于Java学习者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

GMT+8, 2025-1-10 19:30 , Processed in 0.345400 second(s), 36 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表