当前位置:   article > 正文

android——rxjava的使用_rxjava 使用

rxjava 使用

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

本文介绍项目开发中使用到rxjava的情形,以及详细的代码。


一、rxjava是什么?

RxJava是一个基于事件流实现异步操作的框架,其作用是实现异步操作,类似于Android中的AsyncTask。它是在Java虚拟机(JVM)上使用可观测的序列来构建异步的、基于事件的程序。RxJava结合了观察者模式,迭代器模式和函数式的精华,最早由Netflix公司用于减少REST调用次数,后迁移到Java平台,并得到了广泛的应用。

RxJava的一些主要特点包括支持Java 8 Lambda表达式,支持异步和同步编程,具有单一依赖关系,以及简洁、优雅的代码风格。此外,RxJava还解决了“回调地狱”问题,异步处理不再需要回调一层套一层,而是用链式调用的方式完成不同线程的回调。

对于Android开发者来说,RxJava在开发过程中常与RxAndroid一同使用,RxAndroid是针对RxJava在Android平台上使用的响应式扩展组件。然而,尽管RxJava带来了编程上的便利,但其复杂性也使得一些开发者对其持有保留态度。

二、使用步骤

1.引入库

代码如下(示例):

implementation 'io.reactivex.rxjava2:rxjava:2.2.21'

2.rxjava复杂的异步处理

需求:刚进入页面就进行连接(异步返回结果:失败、成功、连接中),点击按钮的时候,有几种状态: 1、连接失败--重新开始连接

        1.1 连接成功 --调阅读的方法

        1.2 连接失败 --UI进行提示失败

2、连接中

         2.1 连接成功 --调阅读的方法

        2.2 连接失败 --UI进行提示失败

3、连接成功 --调阅读的方法
 

实现方式一
  1. class MainActivity : AppCompatActivity() {
  2. private val subHandle = SubHandle()
  3. override fun onCreate(savedInstanceState: Bundle?) {
  4. super.onCreate(savedInstanceState)
  5. setContentView(R.layout.activity_main)
  6. subHandle.mConsumer = null
  7. subHandle.connect().subscribe()
  8. }
  9. fun btRead(view: View) {
  10. subHandle.handleStatus {
  11. subHandle.read()
  12. }
  13. }
  14. /**
  15. * 刚进入页面就进行连接,点击按钮的时候,有几种状态:
  16. * 1、连接失败--重新开始连接,
  17. * 1.1 连接成功 --调阅读的方法
  18. * 1.2 连接失败 --UI进行提示失败
  19. * 2、连接中
  20. * 2.1 连接成功 --调阅读的方法
  21. * 2.2 连接失败 --UI进行提示失败
  22. * 3、连接成功 --调阅读的方法
  23. */
  24. class SubHandle {
  25. var mConsumer: ((Int) -> Unit)? = null
  26. private var status = AtomicInteger(-1) // 0连接失败 1正在连接中 2连接成功
  27. private var disposable: Disposable? = null
  28. fun connect(): Observable<Int> {
  29. status.set(1)
  30. Log.e("TAG", "=连接=")
  31. return Observable.interval(5, TimeUnit.SECONDS)
  32. .take(1)
  33. .map {
  34. val random = Random(System.currentTimeMillis())
  35. val randomNumber = random.nextInt(3) // 生成一个0到2之间的随机整数
  36. Log.e("TAG", "==funA输出$randomNumber")
  37. randomNumber
  38. }
  39. .subscribeOn(Schedulers.io())
  40. .doOnNext {
  41. if (it == 2) {
  42. status.set(2)
  43. mConsumer?.invoke(status.get())
  44. } else {
  45. status.set(0)
  46. Log.e("TAG", "连接阅读器失败,给UI提示")
  47. }
  48. }
  49. }
  50. fun handleStatus(consumer: (Int) -> Unit) {
  51. mConsumer = consumer
  52. when (status.get()) {
  53. 0 -> {
  54. Log.e("TAG", "连接失败过,正重试连接")
  55. disposable?.dispose()
  56. disposable = connect().subscribe()
  57. }
  58. 1 -> Log.e("TAG", "正在连接")
  59. 2 -> mConsumer?.invoke(status.get())
  60. }
  61. }
  62. fun read() {
  63. Log.e("TAG", "开始阅读")
  64. }
  65. }
  66. }
实现方式二
  1. class MainActivity : AppCompatActivity() {
  2. private var canRead = false
  3. private var connectStatus = 0 //1 代表 SUCC, 2 代表 FAIL, 0 代表 CONNECTING
  4. override fun onCreate(savedInstanceState: Bundle?) {
  5. super.onCreate(savedInstanceState)
  6. setContentView(R.layout.activity_main)
  7. connect()
  8. }
  9. private fun connect() {
  10. Log.e("TAG", "=连接=")
  11. Thread(Runnable {
  12. Thread.sleep(5000) // 休眠5秒钟
  13. Observable.just(randomStatus())
  14. .doOnNext { connectStatus = it }
  15. .filter {
  16. Log.e("TAG", "it状态" + it)
  17. it == 1 && canRead
  18. }
  19. .subscribeOn(Schedulers.io())
  20. .doOnNext { read() }
  21. .subscribe()
  22. }).start()
  23. }
  24. fun btRead(view: View) {
  25. canRead = true
  26. Log.e("TAG", "点击按钮" + connectStatus)
  27. when (connectStatus) {
  28. 1 -> read() // 1 代表 SUCC
  29. 2 -> connect() // 2 代表 FAIL
  30. else -> {}
  31. }
  32. }
  33. private fun read() {
  34. Log.e("TAG", "开始阅读")
  35. }
  36. private fun randomStatus(): Int {
  37. val random = Random(System.currentTimeMillis())
  38. return random.nextInt(3) //生成一个0到2之间的随机整数
  39. }
  40. }

3、连续多个弹窗的处理

使用rxjava实现:

  1. class MainActivity : AppCompatActivity() {
  2. private val compositeDisposable = CompositeDisposable()
  3. override fun onCreate(savedInstanceState: Bundle?) {
  4. super.onCreate(savedInstanceState)
  5. setContentView(R.layout.activity_main)
  6. }
  7. @SuppressLint("CheckResult")
  8. fun btRead(view: View) {
  9. Log.e("TAG", "jjjjjj")
  10. showFirstDialog()
  11. .flatMap { showSecondDialog() }
  12. .flatMap { showThirdDialog() }.subscribe({
  13. Log.e("TAG", "3个弹窗都选了确定")
  14. }, { error ->
  15. Log.e("TAG", "点击了取消$error")
  16. })
  17. }
  18. private fun showFirstDialog(): Observable<Unit> {
  19. return Observable.create<Unit> { emitter ->
  20. val dialog = AlertDialog.Builder(this)
  21. .setMessage("第一个弹窗")
  22. .setPositiveButton("确定") { _, _ ->
  23. emitter.onNext(Unit) // 发送事件,表示点击了确定按钮
  24. }
  25. .setNegativeButton("取消") { _, _ ->
  26. emitter.onError(Throwable("1取消")) // 发送错误事件,表示点击了取消按钮
  27. }
  28. .setOnCancelListener {
  29. emitter.onError(Throwable("1取消")) // 发送错误事件,表示点击了返回键
  30. }
  31. .create()
  32. dialog.show()
  33. emitter.setCancellable { dialog.dismiss() } // 在取消订阅时关闭弹窗
  34. }
  35. }
  36. private fun showSecondDialog(): Observable<Unit> {
  37. return Observable.create<Unit> { emitter ->
  38. val dialog = AlertDialog.Builder(this)
  39. .setMessage("第二个弹窗")
  40. .setPositiveButton("确定") { _, _ ->
  41. emitter.onNext(Unit)
  42. }
  43. .setNegativeButton("取消") { _, _ ->
  44. emitter.onError(Throwable("2取消"))
  45. }
  46. .setOnCancelListener {
  47. emitter.onError(Throwable("2取消"))
  48. }
  49. .create()
  50. dialog.show()
  51. emitter.setCancellable { dialog.dismiss() }
  52. }
  53. }
  54. private fun showThirdDialog(): Observable<Unit> {
  55. return Observable.create<Unit> { emitter ->
  56. val dialog = AlertDialog.Builder(this)
  57. .setMessage("第三个弹窗")
  58. .setPositiveButton("确定") { _, _ ->
  59. emitter.onNext(Unit)
  60. }
  61. .setNegativeButton("取消") { _, _ ->
  62. emitter.onError(Throwable("3取消"))
  63. }
  64. .setOnCancelListener {
  65. emitter.onError(Throwable("3取消"))
  66. }
  67. .create()
  68. dialog.show()
  69. emitter.setCancellable { dialog.dismiss() }
  70. }
  71. }
  72. }

协程实现:

  1. fun btRead(view: View) {
  2. lifecycleScope.launch {
  3. try {
  4. showAlertDialog(this@MainActivity, "提示1", "第一个弹窗")
  5. showAlertDialog(this@MainActivity, "提示1", "第二个弹窗")
  6. showAlertDialog(this@MainActivity, "提示1", "第三个弹窗")
  7. } catch (e: Exception) {
  8. Log.e("showAlertDialog", "2222111发生异常")
  9. }
  10. }
  11. }
  12. private suspend fun showAlertDialog(context: Context, title: String, message: String): Boolean =
  13. suspendCancellableCoroutine { ctn ->
  14. val activityRef = WeakReference(context as MainActivity)
  15. val alertDialog = AlertDialog.Builder(context)
  16. .setTitle(title)
  17. .setMessage(message)
  18. .setPositiveButton("确定") { dialog, _ ->
  19. // 点击确定按钮的逻辑处理
  20. dialog.dismiss()
  21. activityRef.get()?.let {
  22. ctn.resume(true) {}
  23. }
  24. }
  25. .setNegativeButton("取消") { dialog, _ ->
  26. // 点击取消按钮的逻辑处理
  27. dialog.dismiss()
  28. activityRef.get()?.let {
  29. ctn.resumeWithException(Exception(message + "取消"))
  30. }
  31. }
  32. .setOnCancelListener {
  33. activityRef.get()?.let {
  34. ctn.resumeWithException(Exception("蒙层取消"))
  35. }
  36. }.create()
  37. alertDialog.show()
  38. }

总结

RxJava是一个基于Java语言的Reactive Extensions库,它用于实现异步编程和流式处理,通过将事件和数据流以数据序列的形式进行处理,提高了代码的可读性和可维护性。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/2023面试高手/article/detail/300703
推荐阅读
相关标签
  

闽ICP备14008679号