Android事件通知工具:RxBus在Eclipse和AS中的实践

简介: Android事件通知工具:RxBus在Eclipse和AS中的实践

相信大家在进行Android开发的时候最头疼的就是这边有一个点击事件,需要传递到其他界面显示结果,或者说有一处变化了需要告诉许多界面去刷新界面。相信经常使用Fragment进行开发的小伙伴们经常会遇到Fragment界面相互影响,相互刷新的各种负责的业务。这些都是我们需要使用到事件通知的场景。


最初我们使用的是Android自身携带的广播Broadcast来解决这个问题,在需要接收的地方注册广播接收监听,然后通过context.sendBroadcast来发送事件,通过Intent来传递数据。这种如果在最初使用的话还是比较简单的,但是如果需要通知的事件多了的话,整个项目里面就都是sendBroadcast以及registerReceiver,广播使用得不好还很容易出现内存泄露,代码的逻辑性以及程序的稳定性将会大打折扣,使用起来也是极其不方便。


后来学习了java的设计模式之观察者模式,自己设计了一套事件通知工具,其实质还是“接口回调监听“,使用起来可以说比广播好了多了,但是嘛,在使用的过程中还是会出现这些或者那些的问题,最主要的问题就是接口回调不能给自由地切换线程,在子线程回调出来的就是子线程,在主线程回调出来的就是主线程,不好进行线程控制。这也是为什么之前EventBus事件工具如此火的原因所在,它可以控制事件触发的子线程还是主线程。


但是仅仅是EventBus根本满足不了我对代码简洁、使用方便、安全的要求。我理想中的事件工具应该是这样的:只需一行代码就可以完成事件动作的注册、只需一行代码就可以完成事件的传递、只需一行代码就可以轻松地注销事件监听,并且可以自由地控制线程,而串联这三个的只需要一个事件TAG即可,后面只需要维护这个事件TAG就行了。不需要像EventBus那样在每个Activity或者Fragment里面写onEventMainThread这种笨笨的代码。那么这样的事件工具真的有吗?当然有啦,那就是接下来我要隆重地推荐以及介绍的RxBus!


RxBus顾名思义是基于RxJava这个目前火得不能再火的项目改造而成的,RxBus继承了RxJava的最大特性:变化【转化】,通过它我们可以轻松地进行线程控制,代码也起来也是极其简洁明了。RxBus的代码很简洁,只有一个java类,如下:


/**
 * RxBus
 * 
 * @author xx
 * 
 */
public class RxBus {
  private ConcurrentHashMap<Object, List> maps = new ConcurrentHashMap<Object, List>();
  private static RxBus sInstance;
  public static RxBus get() {
    if (sInstance == null) {
      synchronized (RxBus.class) {
        if (sInstance == null) {
          sInstance = new RxBus();
        }
      }
    }
    return sInstance;
  }
  /**
   * 简单以对象的类名注册
   * @param o
   * @return
   */
  public  Observable simpleRegister(@NonNull Object o) {
    return register(o.getClass().getSimpleName());
  }
  /**
   * 注册订阅
   * @param tag
   * @return
   */
  public  Observable register(@NonNull Object tag) {
    List subjects = maps.get(tag);
    if (subjects == null) {
      subjects = new ArrayList();
      maps.put(tag, subjects);
    }
    Subject subject = PublishSubject. create();
    subjects.add(subject);
    return subject;
  }
  /**
   * 注销tag制定的订阅
   * @param tag
   */
  public void unregister(@NonNull Object tag, @NonNull Observable observable) {
    List subjects = maps.get(tag);
    if (subjects != null) {
      subjects.remove((Subject) observable);
      if (subjects.isEmpty()) {
        maps.remove(tag);
      }
    }
  }
  /**
   * 注销tag所有的订阅
   * @param tag
   */
  public void unregisterAll(@NonNull Object tag) {
    List subjects = maps.get(tag);
    if (subjects != null) {
      maps.remove(tag);
    }
  }
  public void post(@NonNull Object tag) {
    post(tag, tag);
  }
  /**
   * 发送指定tag的事件
   * @param tag
   * @param o
   */
  @SuppressWarnings("unchecked")
  public void post(@NonNull Object tag, @NonNull Object o) {
    List subjects = maps.get(tag);
    if (subjects != null && !subjects.isEmpty()) {
      for (Subject s : subjects) {
        s.onNext(o);
      }
    }
  }
}
public class RxManager {
  private final static String TAG = "RxManager";
  private static RxManager sInstance;
  private RxBus mRxBus = RxBus.get();
  /** 管理Subscribers订阅,防止内存泄漏 */
  private ConcurrentHashMap maps = new ConcurrentHashMap();
  public static RxManager get() {
    if (sInstance == null) {
      synchronized (RxManager.class) {
        if (sInstance == null) {
          sInstance = new RxManager();
        }
      }
    }
    return sInstance;
  }
  /**
   * 
   * RxBus注入监听
   * 
   * @param eventName
   * 
   * @param action1
   */
  public  void onMainThread(Object eventName, Action1 action1) {
    Observable Observable = mRxBus.register(eventName);
    /* 订阅管理 */
    add(eventName, Observable.observeOn(AndroidSchedulers.mainThread()).subscribe(action1, new Action1() {
      @Override
      public void call(Throwable throwable) {
        Log.e(TAG, throwable.getMessage());
      }
    }));
  }
  /**
   * 
   * RxBus注入监听
   * 
   * @param eventName
   *            事件名
   * @param action1
   */
  public  void on(Object eventName, Action1 action1) {
    Observable Observable = mRxBus.register(eventName);
    /* 订阅管理 */
    add(eventName, Observable.subscribe(action1, new Action1() {
      @Override
      public void call(Throwable throwable) {
        Log.e(TAG, throwable.getMessage());
      }
    }));
  }
  /**
   * 单纯的Observables 和Subscribers管理
   * 
   * @param m
   */
  public void add(Object eventName, Subscription m) {
    /* 订阅管理 */
    CompositeSubscription subscription = maps.get(eventName);
    if (subscription == null) {
      subscription = new CompositeSubscription();
      maps.put(eventName, subscription);
    }
    subscription.add(m);
  }
  /**
   * 
   * 单个presenter生命周期结束,取消订阅和所有rxbus观察
   */
  public void clear(@NonNull Object eventName) {
    CompositeSubscription subscription = maps.get(eventName);
    if (subscription != null) {
      subscription.unsubscribe(); // 取消订阅
      maps.remove(eventName);
    }
    mRxBus.unregisterAll(eventName);
  }
  // 发送rxbus
  public void post(Object tag) {
    mRxBus.post(tag);
  }
  // 发送rxbus
  public void post(Object tag, Object content) {
    mRxBus.post(tag, content);
  }
}


这里我就不具体阐述RxBus以及RxManager是如何起到事件通知的效果的,想了解的可以自行去了解Rxjava的特性。


这里我只介绍如何使用RxBus。


1、首先是事件动作注册:


RxManager.get().on注册的事件回调后返回的还是当前的线程,RxManager.get().onMainThread注册的事件回调后返回的直接是主线程。


20170518152120374.png


2、其次是事件的通知:


直接调用RxManager.get().post(Event_Key) :不携带数据的事件


RxManager.get().post(Event_Key,object) :携带数据的事件


20170518152611292.png


3、最后就是事件监听的销毁:


直接调用RxManager.get().clear(Event_Key)即可。


20170518152840978.png


以上三部即可完成事件通知的全过程,是不是很方便啊,O(∩_∩)O~~,实在是太给力了!


相关文章
|
26天前
|
移动开发 安全 Android开发
构建高效Android应用:Kotlin协程的实践与优化策略
【5月更文挑战第30天】 在移动开发领域,性能优化始终是关键议题之一。特别是对于Android开发者来说,如何在保证应用流畅性的同时,提升代码的执行效率,已成为不断探索的主题。近年来,Kotlin语言凭借其简洁、安全和实用的特性,在Android开发中得到了广泛的应用。其中,Kotlin协程作为一种新的并发处理机制,为编写异步、非阻塞性的代码提供了强大工具。本文将深入探讨Kotlin协程在Android开发中的应用实践,以及如何通过协程优化应用性能,帮助开发者构建更高效的Android应用。
|
4天前
|
开发工具 Android开发 iOS开发
探索安卓与iOS开发的差异:从工具到用户体验
【6月更文挑战第20天】在移动应用开发的广阔天地中,安卓和iOS两大平台各自占据半壁江山。本文将深入探讨这两个操作系统在开发环境、编程语言、用户界面设计以及性能优化等方面的关键差异。我们将通过比较分析,揭示各自平台的独特优势和面临的挑战,为开发者提供决策参考,并为最终用户提供更深层次的用户体验洞察。
|
7天前
|
安全 IDE Android开发
探索Android与iOS开发的差异:平台特性与编程实践
【6月更文挑战第17天】在移动应用开发的广阔天地中,Android和iOS两大平台各自占据半壁江山。它们在用户群体、系统架构以及开发环境上的差异,为开发者带来了不同的挑战和机遇。本文深入探讨了这两个平台在技术实现、界面设计、性能优化等方面的主要区别,并提供了实用的开发建议,旨在帮助开发者更好地理解各自平台的特性,从而创造出更加优秀的移动应用。
|
22天前
|
XML Android开发 数据格式
37. 【Android教程】基于监听的事件处理机制
37. 【Android教程】基于监听的事件处理机制
22 2
|
29天前
|
API 调度 Android开发
打造高效Android应用:探究Kotlin协程的优势与实践
【5月更文挑战第27天】在移动开发领域,性能优化和响应速度是衡量应用质量的关键因素。随着Kotlin语言的普及,协程作为其核心特性之一,为Android开发者提供了一种全新的并发处理方式。本文深入探讨了Kotlin协程在Android应用开发中的优势,并通过实例演示如何在实际项目中有效利用协程提升应用性能和用户体验。
|
1月前
|
编解码 缓存 Android开发
安卓应用性能优化实践
【5月更文挑战第25天】 在移动开发领域,随着用户对应用响应速度和流畅度要求的不断提高,安卓应用的性能优化已成为开发者不可忽视的重要课题。本文将深入探讨针对安卓平台进行性能优化的策略与实战技巧,包括内存管理、多线程应用、UI渲染效率提升以及电池使用效率优化等方面。通过分析常见的性能瓶颈并提供相应的解决方案,旨在帮助开发者构建更加高效、流畅的安卓应用。
|
1月前
|
移动开发 Android开发 开发者
构建高效Android应用:探究Kotlin协程的优势与实践
【5月更文挑战第21天】在移动开发领域,性能优化和流畅的用户体验是至关重要的。随着Kotlin语言在Android平台的广泛采纳,其并发处理的强大工具—协程(Coroutines),已成为提升应用响应性和效率的关键因素。本文将深入分析Kotlin协程的核心原理,探讨其在Android开发中的优势,并通过实例演示如何有效利用协程来优化应用性能,打造更加流畅的用户体验。
30 4
|
1月前
|
缓存 移动开发 Android开发
Android应用性能优化实践
【5月更文挑战第20天】 在移动开发领域,应用的性能直接关乎用户体验。特别是对于Android平台,由于设备多样性和应用生态环境的复杂性,性能优化成为了开发者必须面对的挑战。本文将深入探讨Android应用性能优化的多个方面,包括内存管理、UI渲染、多线程处理以及电池效率等,旨在为开发者提供一系列实用的优化策略和技巧。
|
26天前
|
物联网 区块链 Android开发
构建高效Android应用:Kotlin与Jetpack的实践之路未来技术的融合潮流:区块链、物联网与虚拟现实的交汇点
【5月更文挑战第30天】 在移动开发领域,效率和性能始终是开发者追求的核心。随着技术的不断进步,Kotlin语言以其简洁性和现代化特性成为Android开发的新宠。与此同时,Jetpack组件为应用开发提供了一套经过实践检验的库、工具和指南,旨在简化复杂任务并帮助提高应用质量。本文将深入探索如何通过Kotlin结合Jetpack组件来构建一个既高效又稳定的Android应用,并分享在此过程中的最佳实践和常见陷阱。
|
27天前
|
运维 监控 Android开发
构建高效自动化运维系统的策略与实践构建高效Android应用:Kotlin协程的实践指南
【5月更文挑战第29天】随着信息技术的迅猛发展,企业IT基础设施变得日益复杂,传统的手动运维模式已难以满足高效率、高稳定性的要求。本文将深入探讨如何通过自动化工具和策略来构建一个高效的自动化运维系统。文中不仅分析了自动化运维的必要性,还详细介绍了实现过程中的关键步骤,包括监控、配置管理、故障响应等,并结合实际案例分析其效果,以期为读者提供一套行之有效的自动化运维解决方案。

推荐镜像

更多