【问题标题】:android modularisation - Get a call back from another module when launched through Intentandroid 模块化 - 通过 Intent 启动时从另一个模块获取回调
【发布时间】:2020-05-19 10:14:30
【问题描述】:

我目前正在研究 android 模块化。如果 API 调用期间的模块 A(未经授权)在模块 B(登录模块)中启动活动,我有一个场景。是否可以回调模块A 模块B 的登录是否成功,以便我们可以尝试失败的请求。

我们可以通过 StartActivtyForResult Intent 得到回调。但是当有很多 API 请求时,将无法很好地处理 Intent 结果。它还可能导致整个应用程序在处理意图时重复代码。

有没有办法保持失败的 API 调用并在从另一个模块回调后重试?有关该方法的任何想法都会有所帮助

【问题讨论】:

  • 你应该声明模块核心,模块核心将声明EventBus模式,如果你使用RxJava你可以使用PublishSubject将事件推送到之前的Activity不同的模块。你使用 RxJava 吗?
  • 谢谢丛海。是的,我正在使用 Rxjava。 PublishSubject 是用来观察登录状态还是可以持有api调用方法重试导致登录模块。需要探索 PublishSubject 可以提供什么。

标签: android android-architecture-navigation modularity unauthorized android-architecture


【解决方案1】:
  1. 创建core模块,制作module Amobule B实现模块core

  2. 在模块core 中添加依赖项RxJava2 并创建类EventBusEvent。如果你想用更多数据推送Event,只需扩展它即可。

object EventBus {
    private val sStream: Subject<Event> = PublishSubject.create<Event>().toSerialized()

    @JvmStatic
    fun push(event: Event) {
        sStream.onNext(event)
    }

    @JvmStatic
    fun observerOnUi(topic: Int): Observable<Event> {
        return sStream.filter { event: Event -> event.topic == topic }.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread())
    }

    @JvmStatic
    fun observerOnBackground(topic: Int): Observable<Event> {
        return sStream.filter { event: Event -> event.topic == topic }.subscribeOn(Schedulers.io())
    }
}
open class Event(val topic: Int)
  1. 在模块 B 中的使用可以调用
EventBus.push(Event(REQUEST_FAILED)
  1. 在模块 A 中观察 create CompositeDisposable 确保在组件销毁时调用 dispose()。
val disposable = CompositeDisposable()
disposable.add(EventBus.observerOnUi(REQUEST_FAILED).subscribe({
   // do anything
}))

我使用 Kotlin 代码,如果您在转换为 Java 时遇到问题,请告诉我

【讨论】:

  • 我确实使用 Kotlin,感谢您提供代码,会尝试让您知道
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-09-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-28
  • 2020-11-24
  • 1970-01-01
相关资源
最近更新 更多