android AsyncTask

简介: android AsyncTask

android AsyncTask


在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)


目录
相关文章
|
7月前
|
Java 数据库 Android开发
Android异步之旅:探索AsyncTask
Android异步之旅:探索AsyncTask
62 0
|
3月前
|
Android开发 开发者 Kotlin
告别AsyncTask:一招教你用Kotlin协程重构Android应用,流畅度飙升的秘密武器
【9月更文挑战第13天】随着Android应用复杂度的增加,有效管理异步任务成为关键。Kotlin协程提供了一种优雅的并发操作处理方式,使异步编程更简单直观。本文通过具体示例介绍如何使用Kotlin协程优化Android应用性能,包括网络数据加载和UI更新。首先需在`build.gradle`中添加coroutines依赖。接着,通过定义挂起函数执行网络请求,并在`ViewModel`中使用`viewModelScope`启动协程,结合`Dispatchers.Main`更新UI,避免内存泄漏。使用协程不仅简化代码,还提升了程序健壮性。
101 1
|
6月前
|
Android开发
40. 【Android教程】AsyncTask:异步任务
40. 【Android教程】AsyncTask:异步任务
147 2
|
7月前
|
Java Android开发
Android 中的AsyncTask的使用心得
Android 中的AsyncTask的使用心得
37 1
|
7月前
|
Android开发 开发者
Android AsyncTask 的使用
Android AsyncTask 的使用
52 1
|
7月前
|
安全 API 数据库
【转】Android线程模型(AsyncTask的使用)
【转】Android线程模型(AsyncTask的使用)
48 1
|
7月前
|
Android开发
Android中的多线程及AsyncTask的引入,最终入职阿里
Android中的多线程及AsyncTask的引入,最终入职阿里
|
7月前
|
Java Android开发
android AsyncTask入门
android AsyncTask入门
35 0
|
7月前
|
Android开发 开发者
Android网络和数据交互: 请解释Android中的AsyncTask的作用。
Android&#39;s AsyncTask simplifies asynchronous tasks for brief background work, bridging UI and worker threads. It involves execute() for starting tasks, doInBackground() for background execution, publishProgress() for progress updates, and onPostExecute() for returning results to the main thread.
44 0
|
安全 Java Android开发
Android 中AsyncTask后台线程,异步任务的理解
Android 中AsyncTask后台线程,异步任务的理解
165 0