首页 > 其他分享 >android AsyncTask

android AsyncTask

时间:2023-04-13 13:58:17浏览次数:37  
标签:task doInBackground AsyncTask 调用 UI 线程 android

在Android中每一个应用都拥有自己的独立进程,而一个进程可以拥有多个线程,在这些线程中有一个线程叫做MainThread(也叫UIThread).它负责显示、更新UI,与用户交互.

其他的线程叫做WorkerThread(也叫工作线程),由于在主线程中做耗时的操作会阻塞主线程,影响UI更新,会让用户感觉到应用卡顿,所以我们需要把耗时的操作放到工作线程当中去,例如:网络请求,IO操作,数据库读写.

另外工作线程是不允许操作UI的,如果你想在工作线程中操作UI,那么你将会得到如下错误:
android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.

那么当我们想在做完耗时的操作后更新UI怎么办?比如我去网络下载图片,下载完成后显示到UI上,可能机智的你已经知道了Thread+Handler的方式,但是每次都要定义那么多东西,太麻烦了!这时候AsyncTask应运而生!

1.AsyncTask的基本介绍

AsyncTask是Android对Thread+Handler的一个二次封装(由于内部封装了Handler,致使AsyncTask只能在主线程创建),在既要使用到WorkerThread又要与UI交互的时候,AsyncTask就能发挥出它最大的作用,给你带来非常大的便利.本系列将会讲解在AsyncTask在Android的使用方法,注意点,技巧等.

AsyncTask<Params,Progress,Result>是一个抽象类,通常需要继承它来使用.

  • Params 启动时接受的参数类型,在doInBackground中返回 需要在execute方法中传入
  • Progress 进行中返回的进度的类型,
  • Result 结束后返回的结果类型

2.AsyncTask的方法:

  • doInBackground(Params) 异步执行任务时调用,并且接受参数,与Thread的run方法类似,与其他方法不同的是, 这个方法必须要重写.
  • onPreExecute 在任务开始之前调用,通常可以用来做初始化参数,或者判断网络是否连接.
  • onProgressUpdate 在doInBackground中调用publishProgress()触发.
  • onPostExecute  doInBackground方法执行完成之后会调用,并接受Result.
  • onCancelled(Result) 任务被取消时候调用
  • onCancelled 同上

一般情况下AsyncTask的执行顺序是
onPreExecute->doInBackground->onProgressUpdate->onPostExecute

3.AsyncTask的并发数量有限,一般情况下需要等上一个AsyncTask执行完毕之后才能执行下一个

4.取消AsyncTask

AsyncTask.cancel(mayInterruptIfRunning);

参数mayInterruptIfRunning: true if the thread executing this task should be interrupted; otherwise, in-progress tasks are allowed to complete.(传true表示task应该被中断,false代表进行中的task被允许执行完毕)

但是需要注意的是,调用cancel方法并不能真正立即把task取消掉,而只是把task的状态置为Cancel而已,需要配合isCancelled()方法来运用,在doingbackground或其他方法中判断是否被取消,然后做相应的处理.

 

5.总结

  1. AsyncTask只能在主线程创建
  2. AsyncTask中只有doInBackground方法是异步的
  3. 一个AsyncTask不能被execute两次
  4. AsyncTask调用cancel后走的是onCanceled而不是onPostExecute,并且cancel并不能真正立即取消task,如果想要立即取消还需要isCancelled()方法来辅助.
  5. 默认并发执行的AsyncTask只有一个,即下一个task需要在上一个task执行完毕后才会执行(从Android的某个版本开始,具体哪个忘记了,忘知道的留言指导)
  6. AsyncTask的方法都是系统调用的,不要手动调用

异步之AsyncTask(一) - 简书 (jianshu.com)

标签:task,doInBackground,AsyncTask,调用,UI,线程,android
From: https://www.cnblogs.com/wanglongjiang/p/17314506.html

相关文章

  • 查看xxx.apk文件的AndroidManifest.xml操作步骤:
    查看xxx.apk文件的AndroidManifest.xml操作步骤: 1.使用7.zip打开xxx.apk文件,且将该文件夹中的AndroidManifest.xml文件复制出来。 2、AndroidManifest.xml文件复制到AXMLPrinter2文件夹中。 3、在AXMLPrinter2文件夹输入cmd进入命令行模式。 4、输入java-jarAXMLPrinter2.jarAn......
  • android: 平台版本对应api及占比统计(android studio 2022.1.1)
    一,查看平台版本对应的api官方文档地址:https://developer.android.google.cn/guide/topics/manifest/uses-sdk-element.html?utm_campaign=adp_series_sdkversion_010616&utm_source=medium&utm_medium=blog&hl=zh-cn#ApiLevels如图: 二,查看各版本的支持比率:启动androi......
  • Android sqlite 数据库查询,插入,删除,更新demo<第1章>
    //20140424创建数据库帮助类DataBaseHelper,继承SQLiteOpenHelper, 1. 编写构造函数,实现数据库创建;publicstaticfinalStringTAG="ListViewActivity";privatestaticintVERSION=1;privatestaticfinalStringTABLE_NAME="user1";privatestaticfinalSt......
  • Android App状态栏变色:ColorfulStatusBar
    适用于版本大于等于19以上。importandroid.annotation.TargetApi;importandroid.app.Activity;importandroid.content.Context;importandroid.graphics.Color;importandroid.os.Build;importandroid.view.View;importandroid.view.ViewGroup;......
  • Android动态设置drawableRight
    DrawablerightDrawable=getResources().getDrawable(R.drawable.icon);//调用setCompoundDrawables时,必须调用Drawable.setBounds()方法,否则图片不显示rightDrawable.setBounds(0,0,rightDrawable.getMinimumWidth(),rightDrawable.getMinimumHeight());//left,top,r......
  • 直播电商平台开发,Android | 图片缩放、自动居中
    直播电商平台开发,Android|图片缩放、自动居中1、activity_main.xml <?xmlversion="1.0"encoding="utf-8"?><FrameLayout  xmlns:android="http://schemas.android.com/apk/res/android"  android:layout_width="fill_parent"  a......
  • 搭建直播平台,Android ListView 长按删除列表项
    搭建直播平台,AndroidListView长按删除列表项一、核心代码监听器-长按弹出对话框AdapterView.OnItemLongClickListener    privatefinalAdapterView.OnItemLongClickListeneritemDeleteListener=newAdapterView.OnItemLongClickListener(){    @Over......
  • 直播平台软件开发,Android代码模拟触摸、点击及滑动等事件
    直播平台软件开发,Android代码模拟触摸、点击及滑动等事件一、应用中模拟物理和屏幕点击事件 例如,模拟对某个view的点击事件 privatevoidsimulateClick(Viewview,floatx,floaty){  longdownTime=SystemClock.uptimeMillis();  finalMotionEventdownEve......
  • android Route模块化路由设计方案
    背景:我们在移动端开发过程,随着业务越来越多,越来越复杂,在架构中会将业务进行剥离和抽取,这样会出现许多业务模块。但是各业务模块又有业务关联,常见的就是Activity之间的跳转。但是,一些大的公司,或者业务线非常多的app大多数采用混合模式,常见的就是H5和app混合,特别是电商商业比较常见。......
  • Android Kotlin实战之高阶使用泛型扩展协程懒加载详解
    前言:通过前面几篇文章,我们已基本掌握kotlin的基本写法与使用,但是在开发过程中,以及一些开源的API还是会出现大家模式的高阶玩法以及问题,如何避免,接下来讲解针对原来的文章进行一些扩展,解决大家在工作中遇到的问题,如何去解决如果还有人不了解kotlin,可以查看我的基础篇kotlin。Android......