目录
1.AsyncTask:
(1)模板参数说明:
(2)自定义的任务类需要实现以下方法:
(3)AsyncTask有如下可直接调用的启停方法:
2.Thread + Handler:
在Android开发中,AsyncTask(异步任务) 和 Thread + Handler 都用于在后台执行任务,但它们的使用场景和常见程度有所不同。AsyncTask 在简单的异步任务和UI更新场景下比较常见,而 Thread + Handler 则更适用于复杂的异步任务和需要更精细控制的情况。然而,随着Android开发的发展,推荐使用 Thread + Handler 或者更现代化的异步任务处理方式,如 Kotlin 协程等。
1.AsyncTask:
AsyncTask(异步任务) 是 Android 提供的一个类,用于在后台执行异步任务并在主线程更新UI。它封装了线程管理和UI线程更新,使得在后台执行任务并更新UI更加方便。AsyncTask 适合较为简单的异步任务,如网络请求、数据库操作等,且需要在后台执行完成后更新UI的情况。在较早的Android版本中,AsyncTask 是处理异步任务的主要方法之一。但是,由于其存在一些局限性和安全隐患(如内存泄漏、活动销毁时的异常处理等),且AsyncTask的全局线程池只有5个工作线程,如果同一时间有太多的线程请求,可能会造成阻塞;因此不建议使用`AsyncTask`进行大量的网络数据获取 ,在较新的Android开发中逐渐被废弃或不推荐使用。
Asynctask是一个模板类(Asynctask<Params, Progress, Result>),从它派生而来的新类需要指定模板的参数类型。
(1)模板参数说明:
- Params:任务启动时的输入参数,比如HTTP访问的URL地址、请求报文等。可设置为String类型或自定义的数据结构。
- Progress:任务执行过程中的进度。一般设置为Integer类型,表示当前处理进度。
- Result:任务执行完的结果参数,比如HTTP调用的执行结果、返回报文等。可设置为String类型或自定义的数据结构。
(2)自定义的任务类需要实现以下方法:
- onPreExecute:准备执行任务时触发。该方法在doInBackground方法执行之前调用。
- doInBackground:在后台执行的业务处理。网络请求等异步处理操作都放在该方法中,输入参数对应execute方法的输入参数,输出参数对应onPostExecute方法的输入参数。注意,该方法运行于分线程,不能操作界面,其他方法都能操作界面。
- onProgressUpdate:在doInBackground方法中调用publishProgress方法时触发。该方法通常用于在处理过程中刷新进度条。
- onPostExecute:任务执行完成时触发,方法内部可在页面上显示处理结果。该方法在doInBackground方法执行完毕后调用,输入参数对应doInBackground方法的输出参数。
- onCancelled:调用任务对象的cancel方法时触发。表示取消任务并返回。
(3)AsyncTask有如下可直接调用的启停方法:
- execute:开始执行异步处理任务。
- executeOnExecutor:以指定的线程池模式执行任务。AsyncTask 内置的线程池模式有以下两个。AsyncTask.THREAD_POOL_EXECUTOR表示异步线程池(各任务间没有先后顺序,即有可能某任务在后面调用却先执行)。AsyncTask.SERIAL_EXECUTOR表示同步线程池(各任务按照代码调用的先后顺序依次排队等待执行),execute方法默认使用SERIAL_EXECUTOR。
- publishProgress:更新进度。该方法只能在doInBackground方法中调用,调用后会触发onProgressUpdate方法。
- get:获取处理结果。
- cancel:取消任务。该方法调用后,doInBackground方法中的处理可能不会马上停止;若想立即停止处理,则可在doInBackground方法中加入isCancelled的判断。
- isCancelled:判断该任务是否取消。true表示取消,false表示未取消。
- getStatus:获取任务状态。PENDING表示未执行(onPreExecute处理之前);RUNNING表示正在执行(onPreExecute、doInBackground、onPostExecute运行期间);FINISH表示执行完毕(onPostExecute处理结束)。
2.Thread + Handler:
Thread(线程) 是Java中的线程类,用于创建和管理线程。Handler(处理器) 用于与UI线程进行通信,通过发送消息或者投递任务来更新UI。Thread + Handler 的组合更加灵活,适用于复杂的异步任务和需要更精细控制的情况。这种方式需要开发者自己管理线程的生命周期和线程间的通信,相对于 AsyncTask 更为底层,但也更加灵活和强大。Thread + Handler 在一些特定场景下更为常见,尤其是对于需要精确控制线程执行顺序、避免内存泄漏以及实现自定义的线程池等需求。
在非主线程中创建Handler时请注意需要手动初始化Loop,Looper.prepare()和Looper.loop()、Looper.quit();主线程因会自动初始化Loop无需手动初始化。
//非主线程
public class MyThread extends Thread{
public Handler handler;
public void run() {
Looper.prepare();
handler=new Handler(){
public void handleMessage(@NonNull Message msg) {
//执行代码
}
};
Looper.loop();
// .loop()以下代码在 .quit()前不执行
}
}
//主线程
Handler handler;
handler=new Handler(){
public void handleMessage(@NonNull Message msg) {
//执行代码
}
};
tag:异步任务,AsyncTask,异步线程,线程,thread,处理器,handler