【问题标题】:Notify UI from OkHttp Interceptor从 OkHttp 拦截器通知 UI
【发布时间】:2020-01-17 07:30:15
【问题描述】:

我需要根据拦截器中的布尔值更改 UI(我只在拦截器内部了解它,它永远不会离开它)。

我认为的可能解决方案:
创建像 new Handler(Looper.getMainLooper()) 这样的处理程序,然后执行 .post(new Runnable()..),但我不想将 UI 逻辑混入 Interceptor 类。

【问题讨论】:

  • 只是一个简单的问题,为什么你必须这样做?对我来说似乎有点不对劲。
  • @barotia 我提出了一些请求,然后在拦截器中(已经设计,无法更改)检查正在运行的设备是否正常。如果不是我想在 UI 中显示消息。
  • 遗留代码? :D 太有趣了,反正如果你没有时间重新设计,我首先想到的是内容提供者和 rxjava,但是,这取决于项目的复杂性,tbh 使用 CP 和 RX 似乎有点矫枉过正,但是委派听众,这可能会很混乱。
  • 你用java还是kotlin?

标签: android okhttp interceptor


【解决方案1】:

您可以尝试使用EventBus

  1. 将以下依赖项添加到您的 build.gradle 文件中:
dependencies {
    // ...
    implementation 'org.greenrobot:eventbus:3.1.1'
}
  1. 创建用于保存来自拦截器的数据的类:
public static class InterceptorEvent { /* Add fields you need */ }
  1. 在您的拦截器中,使用以下代码发布事件:
EventBus.getDefault().post(new InterceptorEvent());
  1. 随时随地订阅InterceptorEvent
@Subscribe(threadMode = ThreadMode.MAIN)  
public void onInterceptorEvent(InterceptorEvent event) {
    // Do whatever you want
}

@Override
public void onStart() {
    super.onStart();
    EventBus.getDefault().register(this);
}

@Override
public void onStop() {
    super.onStop();
    EventBus.getDefault().unregister(this);
}

希望我的回答对你有帮助。

【讨论】:

  • 很好,只是一个问题,目前是否支持?
  • 上次提交是在 6 个月前。但是,我已经在一些生产项目中使用它,还没有发现任何大问题。
  • @barotia 如果你想要支持的话,你可以使用 LiveData 来实现它。
  • 我会留在 rx 或者只是简单的 contentproviders,如果你从多个线程开始工作,实时数据并不能真正起作用,无论如何,这不是主要目的。
  • 是的,我并不是在捍卫应该始终使用 EventBus 库的想法,但它很有帮助,尤其是当您有没有时间重构的遗留代码时。
猜你喜欢
  • 2015-04-16
  • 2020-09-18
  • 1970-01-01
  • 1970-01-01
  • 2015-10-05
  • 2021-09-01
  • 2019-12-28
  • 2017-07-03
  • 1970-01-01
相关资源
最近更新 更多