Docsify/language/kotlin/Android异步开发漫谈.md

79 lines
3.9 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 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<Void, Void, String>() {
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示例
```
```