Android 基础面试题的考察重点包括 Activity 和 Fragment 的生命周期、四大组件(Activity、Service、BroadcastReceiver、ContentProvider)的使用、布局与视图系统、Intent 的传递、权限管理、以及常见的 UI 控件与事件处理。(简短为主,不是最新版本辩证学习)
一、AsyncTask 是什么及其原理?(已废弃问的会越来越少)
回答要点
AsyncTask是Android 中用于进行轻量级县步操作的一个类。它简化了在主线程中执行后台任务的复杂性,同时提供了在任务执行期间和完成后更新UI的便利。主要通过继承AsyncTask类,并重写其相关方法来实现。 AsyncTask的原理主要基于线程池和Handler。它内部维护了一个线程池,用于执行后台任务;同时利用Handler 来切换回主线程,以更新UI。
1) AsyncTask的使用
AsyncTask是一个抽象类,我们通常需要创建一个类继承它并重写其三个核心方法:
- doInBackground(Params...params):这个方法在后台线程中执行主要任务。
- onPreExecute():这个方法在主线程中执行,用于任务开始之前的准备工作。
- onPostExecute(Resultresult):这个方法在主线程中执行,用于任务完成之后的处理
- 另外还有 onProgressupdate(Progress...values)方法用于在后台任务进行过程中更新进度。
2)AsyncTask的局限性AsyncTask适用于执行简单的、时间较短的后台任务。如果任务执行时间过长,可能会导致内存泄漏以及上下文错配等问题。而且它必须在应用程序的UI线程中进行实例化和调用,限制了一些复杂的使用场景。
从Android API 26开始,AsyncTask 被标记为弃用,推荐使用其他库如RxJava或Coroutine进行异步任务处理。
3)线程池的使用
AsyncTask通过线程池执行异步任务,可以有效管理多个任务的执行,提高执行效率。默认情况下,AsyncTask使用5个线程的固定线程池。 可以通过自定义线程池来提交不同任务,改变其并发数量。
4)与其他异步任务处理方式的比较
AsyncTask 相比于Thread +Handler 组合要更加简便,但它没有Intentservice 那么稳健,以至于有局限性。 RxJava 和 Kotin Coroutine提供更强大的功能和灵活性,特别是对于复杂的异步任务处理场景,逐渐取代了 AsyncTask 成为主流选择。
二、开始表演
1. AsyncTask是什么?
AsyncTask是Android 中用于进行轻量级异步操作的一个抽象类,它简化了在主线程中执行后台任务的复杂性,并提供了在任务执行期间和完成后更新UI的便利。
2.AsyncTask 的核心方法有哪些?
AsyncTlsk 的核心方法包括:onPrExecutE()(主线程,任务准备)、doimBackground()(后台线程,执行耗时任务)、onProgresUpdate()(主线程,更新进度)和onPostixequte()(主线程,任务完成后的处理)。
3.AsyncTask 的工作原理是什么?
AsyncTask 的原理基于线程池和 Handlero它使用线程池在后台执行任务,并通过Handler 将结果或进度更新消息发送回主线程,从而实现UI的更新。
4.为什么AsyncTask 被标记为弃用?
从Android APi26开始,AsyncTask被标记为弃用,主要因为它容易引发内存泄露,上下文错配等问题,且仅适合简单的短时任务。官方推荐使用更现代的方案如Kotin Coroutine或Rxjava 来替代。
5.AsyncTask 适用于哪些场景?
AsyncTask适用于执行时间较短、逻辑简单的异步任务,例如网络请求、文件读写等轻量级操作,不适合长时间运行的任务。
6.AsyncTask 内部使用的线程池是怎样的?
AsyncTask默认使用一个固定大小为5的线程池来执行后台任务,这意味着最多可以并发执行5个任务,其余任务将排队等待。
7.AsyncTask 必须在哪个线程中创建和调用?
AsyncTask必须在应用程序的UI线程中实例化并调用 execute方法,否则会抛出异常。
8.相比 Thread + Handler,AsyncTask 有什么优势?
AsyncTask 封装了线程切换和生命周期管理的细节,使用更简便,无需手动创建Handler,即可在后台执行任务并在主线程更新UI。
9.现在推荐使用什么替代 AsyncTask?
目前推荐使用 Kotin 协程(Coroutnes)、Rxjava或 ExecutorService等更灵活、可控性更强的异步处理方式来替代 AsyncTask,特别是在复杂异步场景下。