From a4a8110c2b45ad259c9217d27a018f976805a8e8 Mon Sep 17 00:00:00 2001 From: xiaoyan Date: Thu, 30 Mar 2023 15:16:02 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E5=A2=9E=E5=8A=A0Android=E5=BC=82?= =?UTF-8?q?=E6=AD=A5=E5=BC=80=E5=8F=91=E6=BC=AB=E8=B0=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- language/kotlin/Android异步开发漫谈.md | 79 ++++++++++++++++++++++++++ 1 file changed, 79 insertions(+) create mode 100644 language/kotlin/Android异步开发漫谈.md diff --git a/language/kotlin/Android异步开发漫谈.md b/language/kotlin/Android异步开发漫谈.md new file mode 100644 index 0000000..25cbb4b --- /dev/null +++ b/language/kotlin/Android异步开发漫谈.md @@ -0,0 +1,79 @@ +# Android异步开发漫谈 + +> **如果已经熟悉AsyncTask的用法,可略过本章节** + +## 最早的异步工具 AsyncTask +在 Android 开发中,可以使用 AsyncTask 类处理异步任务。AsyncTask 是 Android 提供的一个便捷的异步任务处理工具,可以在后台线程上执行异步任务,并在主线程上更新 UI 界面。 + +### 使用 AsyncTask 处理异步任务的步骤如下: + +1. 继承 AsyncTask 类,并重写 doInBackground() 方法。在 doInBackground() 方法中执行需要在后台线程上执行的耗时任务。 + +2. 在 doInBackground() 方法中使用 publishProgress() 方法发布进度更新。publishProgress() 方法会触发 onProgressUpdate() 方法,在主线程上更新 UI 界面。 + +3. 在 AsyncTask 子类中实现 onPostExecute() 方法。onPostExecute() 方法会在后台任务执行完成后,在主线程上执行,并可以更新 UI 界面。 + +### 使用 AsyncTask 处理异步任务的优点包括: + +1. 简单易用。AsyncTask 提供了一个简单的接口,可以方便地在后台线程上执行异步任务,并在主线程上更新 UI 界面。 + +2. 解决了 Android 应用中常见的“主线程阻塞”问题。在 Android 应用中,不允许在主线程上执行耗时任务,否则会导致应用无响应。使用 AsyncTask 可以将耗时任务放到后台线程上执行,避免了主线程阻塞的问题。 + +3. 支持进度更新。AsyncTask 支持在后台任务执行过程中发布进度更新,并在主线程上更新 UI 界面。 + +### 使用 AsyncTask 处理异步任务的缺点包括: + +1. 不适合处理长时间运行的任务。AsyncTask 适合处理耗时短暂的任务,如果需要处理长时间运行的任务,可能会导致内存泄漏或其他性能问题。 + +2. 不支持任务取消。AsyncTask 不提供直接的取消任务的方法,需要自行实现任务取消逻辑。 + +3. 不支持多线程。AsyncTask 只能在一个后台线程上执行任务,不支持多线程。 + +因此,在使用 AsyncTask 处理异步任务时,需要根据具体情况进行权衡和选择。如果需要处理长时间运行的任务,可以考虑使用其他的异步任务处理工具,例如 HandlerThread、ThreadPoolExecutor 等。如果需要支持任务取消和多线程,也可以考虑使用这些工具。 + +- 下面是AsyncTask的一个代码示例: +```Kotlin +class MyAsyncTask(private val context: Context) : AsyncTask() { + + private lateinit var progressDialog: ProgressDialog + + override fun onPreExecute() { + super.onPreExecute() + progressDialog = ProgressDialog(context).apply { + setMessage("Loading...") + show() + } + } + + override fun doInBackground(vararg params: Void): String { + // 执行耗时操作,例如网络请求等 + return "Data from server" + } + + override fun onPostExecute(result: String) { + super.onPostExecute(result) + progressDialog.dismiss() + // 处理返回结果 + Toast.makeText(context, result, Toast.LENGTH_SHORT).show() + } +} +``` + +## 最被滥用的Java异步编程范式 Thread +pass + +## 据说是学习难度比较陡峭 RxJava的函数式编程范式 +> 被漫天飞舞的Thread和Handler或者回调地狱折磨得头大的Android开发者终于还是开始了治理异步编程的艰难之旅。RxJava的横空出世给了他们一丝丝曙光,额,但也只有一丝丝。 +> +> 因为这东西据说挺难的...不过,有道是只要学不死,就往死里学,拿出这精神还怕有啥搞不明白的? + +下面通过一个最简单的例子来说明RxJava是如何使用的。 +1. 在Android项目主module(一般命名为app)的build.gradle中添加RxJava的依赖。 + ```xml + implementation 'io.reactivex.rxjava2:rxjava:2.2.7' + implementation 'io.reactivex.rxjava2:rxandroid:2.1.1' + ``` +2. 最简单的RxJava示例 + ``` + + ``` \ No newline at end of file