3.9 KiB
Android异步开发漫谈
如果已经熟悉AsyncTask的用法,可略过本章节
最早的异步工具 AsyncTask
在 Android 开发中,可以使用 AsyncTask 类处理异步任务。AsyncTask 是 Android 提供的一个便捷的异步任务处理工具,可以在后台线程上执行异步任务,并在主线程上更新 UI 界面。
使用 AsyncTask 处理异步任务的步骤如下:
-
继承 AsyncTask 类,并重写 doInBackground() 方法。在 doInBackground() 方法中执行需要在后台线程上执行的耗时任务。
-
在 doInBackground() 方法中使用 publishProgress() 方法发布进度更新。publishProgress() 方法会触发 onProgressUpdate() 方法,在主线程上更新 UI 界面。
-
在 AsyncTask 子类中实现 onPostExecute() 方法。onPostExecute() 方法会在后台任务执行完成后,在主线程上执行,并可以更新 UI 界面。
使用 AsyncTask 处理异步任务的优点包括:
-
简单易用。AsyncTask 提供了一个简单的接口,可以方便地在后台线程上执行异步任务,并在主线程上更新 UI 界面。
-
解决了 Android 应用中常见的“主线程阻塞”问题。在 Android 应用中,不允许在主线程上执行耗时任务,否则会导致应用无响应。使用 AsyncTask 可以将耗时任务放到后台线程上执行,避免了主线程阻塞的问题。
-
支持进度更新。AsyncTask 支持在后台任务执行过程中发布进度更新,并在主线程上更新 UI 界面。
使用 AsyncTask 处理异步任务的缺点包括:
-
不适合处理长时间运行的任务。AsyncTask 适合处理耗时短暂的任务,如果需要处理长时间运行的任务,可能会导致内存泄漏或其他性能问题。
-
不支持任务取消。AsyncTask 不提供直接的取消任务的方法,需要自行实现任务取消逻辑。
-
不支持多线程。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是如何使用的。
- 在Android项目主module(一般命名为app)的build.gradle中添加RxJava的依赖。
implementation 'io.reactivex.rxjava2:rxjava:2.2.7' implementation 'io.reactivex.rxjava2:rxandroid:2.1.1'
- 最简单的RxJava示例