Android中AsyncTask详细介绍
一、
定义与作用
Android中的AsyncTask
是一个抽象类,用于简化异步任务的执行,它通过将耗时操作放在后台线程中执行,避免阻塞主线程(UI线程),从而提高应用程序的响应速度和用户体验,在特定场合下,并不是所有类型都被使用,如果没有被使用,可以用java.lang.Void
类型代替。
优点
方便实现异步通信:无需复杂的线程管理或消息传递机制。
节省资源:采用线程池的缓存线程+复用线程,避免了频繁创建和销毁线程所带来的系统资源开销。
工作原理
AsyncTask
内部封装了两个线程池和一个Handler
,当调用execute()
方法时,它会从线程池中取出一个线程来执行后台任务,任务完成后,通过Handler
将结果切换回主线程进行更新。
二、使用方法
创建AsyncTask子类
继承AsyncTask
类,并为三个泛型参数指定类型;如果不使用,可用java.lang.Void
类型代替,根据需求,在AsyncTask
子类内实现核心方法。
private class MyTask extends AsyncTask<String, Integer, String> { @Override protected void onPreExecute() { super.onPreExecute(); // 执行前的操作,如显示进度条 } @Override protected String doInBackground(String... params) { // 后台耗时操作 return "Result"; } @Override protected void onProgressUpdate(Integer... values) { super.onProgressUpdate(values); // 更新进度 } @Override protected void onPostExecute(String result) { super.onPostExecute(result); // 执行后的操作,如更新UI } }
创建实例并执行任务
创建AsyncTask
子类的实例对象(即任务实例),手动调用execute()
从而执行异步线程任务,注意,同一个AsyncTask
实例对象只能执行一次,若执行第二次将会抛出异常。
MyTask mTask = new MyTask(); mTask.execute("parameter");
三、核心方法介绍
onPreExecute()
在后台任务开始执行之前调用,通常用于做一些准备工作,如显示一个进度条或禁用按钮,这个方法在主线程中运行。
2. doInBackground(Params… params)
在这个方法中编写需要后台执行的任务逻辑,该方法在一个后台线程中运行,可以在这里进行耗时操作,例如网络请求、文件IO等,返回值是后台任务的结果。
3. onProgressUpdate(Progress… values)
当需要更新任务进度时调用此方法,这个方法在主线程中运行,可以用来更新UI组件上的进度信息,通常与publishProgress()
方法配合使用。
4. onPostExecute(Result result)
当后台任务执行完毕后调用此方法,这个方法在主线程中运行,可以用来处理后台任务返回的结果,例如更新UI组件上的内容。
onCancelled()
当异步任务被取消时调用此方法,可以在这个方法中执行一些清理工作,如停止动画或释放资源。
四、注意事项
AsyncTask
的实例必须在UI线程中创建。
execute(Params... params)
方法必须在UI线程中调用。
不能手动调用onPreExecute()
,doInBackground(Params... params)
,onProgressUpdate(Progress... values)
,onPostExecute(Result result)
这几个方法。
不能在doInBackground(Params... params)
中更改UI组件的信息。
一个任务实例只能执行一次,如果执行第二次将会抛出异常。
五、归纳
AsyncTask
提供了一种简单的方式来处理耗时操作而不阻塞主线程,适用于简单的异步任务,对于更复杂的并发需求,建议使用更高级的并发工具,如线程池或RxJava等。
原创文章,作者:未希,如若转载,请注明出处:https://www.kdun.com/ask/1259216.html
本网站发布或转载的文章及图片均来自网络,其原创性以及文中表达的观点和判断不代表本网站。如有问题,请联系客服处理。
发表回复