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

3.9 KiB
Raw Blame History

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的一个代码示例
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的依赖。
        implementation 'io.reactivex.rxjava2:rxjava:2.2.7'
        implementation 'io.reactivex.rxjava2:rxandroid:2.1.1'
    
  2. 最简单的RxJava示例