android - 事件总线库机制是否与使用静态变量在 Activity 之间传递数据一样糟糕?

标签 android android-intent event-bus otto

我正在学习 Android,据我所知,在 Activity 之间传递数据的标准 Android 机制是使用 Intents,而 Intents 又在较低级别上实现为 IPC(也许我错了)。

最近似乎出现了一堆库来让 Android 开发人员的生活变得更轻松。它们之间是著名的事件总线(Greenrobot 的,Square 的 Otto)。我一直在尝试这两种方法(几乎精确的接口(interface)语义),并且看到了一些关于如何使用 Greenrobot 事件总线将事件发布到使用 .postSticky 的 Activity 的帖子,该帖子允许在新 Activity 发生时使用或拉取该事件准备获取此数据。

但从我现在的理解来看,使用 Intents 的主要目的(以及因此在处理复杂对象时使用可序列化/可解析对象的繁琐工作)是允许 Android 在系统杀死应用程序后重新创建这些数据资源限制,通常是当您切换到另一个应用程序并开始玩时。因此,在这种情况下,当您切换回应用程序时,您会在使用事件总线传递的数据上获得 NULL 指针

我是不是漏掉了什么?或者只是这种方法(事件总线将数据传递给 Activity ),即使代码非常干净,也是完全错误的?

最佳答案

the primary aim of using Intents (and therefore the tedious work of using serializable/parcelable objects when you deal with complex objects) is to allow Android to recreate this data after the system kills the app due to resources constraints, usually when you switch to another app and start playing around

这是 Android 的一项功能。我不会将其描述为“使用 Intent 的主要目的”。使用 Intents 的主要目的是能够调用功能(例如,启动一个 Activity),而不管该功能是否在您当前的进程、您的某个单独的进程、其他正在运行的应用程序中执行进程,或在某个尚不存在的进程中(因为相关应用程序目前未运行)。

So when in this situation, when you switch back to yor app, you get NULL pointer on the data that was passed using event bus.

不,您只是在注册监听器时没有收到事件。只要您的代码可以处理这种情况,这里就没有问题。

Or simply this approach (event bus to pass data to activities), even very clean on code, is completely wrong?

我不推荐这种方法。话虽如此,恕我直言,这也不是“完全错误”。 “完全错误”表示不可能使用该技术创建功能正常的 Android 应用程序。 Android 应用程序有广泛的用例,因此即使孤立地使用这种技术,有些应用程序也可能能够生存。而且,在某些情况下,将此技术与其他东西(例如数据持久性)结合使用可能非常好。

postSticky() 只是一个绑定(bind)到事件总线的内存缓存。缓存是许多 Android 应用程序的重要组成部分,可最大限度地减少重复的磁盘或网络 I/O。只要 postSticky() 仅用作内存缓存,应用程序就不会遇到麻烦。依赖 postSticky() 在进程终止后幸存的应用遇到了麻烦,尽管这不是 postSticky() 独有的,而是一种普遍现象。内存缓存问题。依赖任何类型的内存缓存来避免进程终止的应用程序都会遇到麻烦。

关于android - 事件总线库机制是否与使用静态变量在 Activity 之间传递数据一样糟糕?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36936993/

相关文章:

android - 如何从 Intent 中获取文件名?

android - 无法解决 ActivityNotFoundException

guava - EventBus google guava 关闭 Hook

Android 优点和缺点 : Event Bus and RxJava

android - 编译sqlite时出现语法错误

android - 如何更改 Android 中的蓝牙存储位置?

android - 在 Android 上向 MapView 添加单个叠加层

java - 通过 Glide 在 Activity 之间共享图像

java - 如何在Linux上部署java vertx服务器?

android - 取消具有唯一 ReqestCode 的 PendingIntent