1. 程式人生 > >RxJava 和 RxAndroid 一 (基礎)

RxJava 和 RxAndroid 一 (基礎)

package lib.com.myapplication;
import android.support.annotation.NonNull;
import android.util.Log;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.concurrent.ConcurrentHashMap;
import rx.Observable;
import rx.subjects.PublishSubject;
import rx.subjects.Subject;

/**
 * Created by ${zyj} on 2016/5/6.
 */
public class RxBus {

    private static final String TAG = RxBus.class.getSimpleName();
    private static RxBus instance;
    public static boolean DEBUG = false;

    public static RxBus get() {
        if (instance == null) {
            synchronized (RxBus.class) {
                if (instance == null) {
                    instance = new RxBus();
                }
            }
        }
        return instance;
    }

    private RxBus() {
    }

    private ConcurrentHashMap<Object, List<Subject>> subjectMapper = new ConcurrentHashMap<>();

    @SuppressWarnings("unchecked")
    public <T> Observable<T> register(@NonNull Object tag, @NonNull Class<T> clazz) {
        List<Subject> subjectList = subjectMapper.get(tag);
        if (null == subjectList) {
            subjectList = new ArrayList<>();
            subjectMapper.put(tag, subjectList);
        }

        Subject<T, T> subject;
        subjectList.add(subject = PublishSubject.create());
        if (DEBUG) Log.d(TAG, "[register]subjectMapper: " + subjectMapper);
        return subject;
    }

    public void unregister(@NonNull Object tag, @NonNull Observable observable) {
        List<Subject> subjects = subjectMapper.get(tag);
        if (null != subjects) {
            if ( observable != null  && subjects.contains( observable )){
                subjects.remove((Subject) observable);
            }

            if (isEmpty(subjects)) {
                subjectMapper.remove(tag);
            }
        }

        if (DEBUG) Log.d(TAG, "[unregister]subjectMapper: " + subjectMapper);
    }

    public void post(@NonNull Object content) {
        post( content.getClass().getName(), content);
    }

    @SuppressWarnings("unchecked")
    public void post(@NonNull Object tag, @NonNull Object content) {
        List<Subject> subjectList = subjectMapper.get(tag);

        if (!isEmpty(subjectList)) {
            for (Subject subject : subjectList) {
                subject.onNext(content);
            }
        }
        if (DEBUG) Log.d(TAG, "[send]subjectMapper: " + subjectMapper);
    }

    private boolean isEmpty(Collection collection) {
        return null == collection || collection.isEmpty();
    }
}

相關推薦

RxJava RxAndroid (基礎)

package lib.com.myapplication; import android.support.annotation.NonNull; import android.util.Log; import java.util.ArrayList; import java.util.Colle

rxJavarxAndroid原始碼解析系列四之subscribeOnobserveOn的理解(學習終結篇)

本篇文章主要解決subscribeOn和observeOn這兩個方法為什麼subscribeOn只有一次有效果,observeOn切換多次回撥的都有效果。 不知道朋友有沒有看過rxandroid的原始碼,如果看過的話,就會迎刃而解,沒什麼疑慮啦。沒看過原始碼的朋友,可以看看我這個系列的前幾篇文章

rxJavarxAndroid原始碼解析系列二之observer訂閱

建立完Observable物件後,以後一步ObservableObserveOn.subscribe(new Observer<String>() {.....})這一步又發生了什麼呢? 接著跟蹤原始碼。 @SchedulerSupport(Schedu

RxJavaRxAndroid用法詳解

RxJava 在 GitHub 主頁上的自我介紹是 "a library for composing asynchronous and event-based programs using observable sequences for the Java VM"(一個在 J

RxJava RxAndroid 三(生命週期控制記憶體優化)

rxjava rxandroid 趙彥軍 RxJava使我們很方便的使用鏈式程式設計,程式碼看起來既簡潔又優雅。但是RxJava使用起來也是有副作用的,使用越來越多的訂閱,記憶體開銷也會變得很大

RxJava RxAndroid 四(RxBinding的使用)

對Rxjava不熟悉的同學可以先看我之前寫的幾篇文章 前言:RxBinding 是 Jake Wharton 的一個開源庫,它提供了一套在 Android 平臺上的基於 RxJava的 Binding API。所謂 Binding,就是類似設定 OnClickListener 、設定

RxJava RxAndroid 二(操作符的使用)

前言:對Rx不瞭解的朋友可以先看我的第一篇博文 ,是對Rxjava的基本介紹 1、merge操作符,合併觀察物件 19 List<String> list1 = new ArrayList<>() ; 20 List<String&g

RxJava RxAndroid 五(執行緒排程)

對rxJava不瞭解的同學可以先看 本文將有幾個例子說明,rxjava執行緒排程的正確使用姿勢。 例1 Observable .create(new Observable.OnSubscribe<String>() {

程式設計師面試寶典隨筆記()---執行緒程序1,-基礎資訊

①程式,程序,執行緒的區別 程式:程式是由一系列的指令和邏輯組成的一個靜態檔案(如cpp檔案),無論能不能執行,它都客觀的存在於儲存器中。 程序:程序是計算機中的程式關於某資料集合

python之scrapy()基礎入門

Scrapy框架的使用 一、 Scrapy框架的介紹 Scrapy是一個基於 Twisted 非同步處理的框架,是一個純python的網路爬蟲框架,是一個為了爬取網站資料,提取結構性資料而編寫的應用框架。 其可以應用在資料探勘,資訊處理或儲存歷史資料等一系列的程式中。其最初是為了頁面抓取 (

個性化定義部落格園 ()---基礎準備以及新增動態背景音樂控制元件

寫在前面       擁有部落格僅僅只是開始,後續該怎樣美化部落格?怎樣使部落格更有個性?這都需要我們一點點去做。由此,我總結出了一些方法,希望能對你有所幫助。我們將以部落格園美化來教你怎樣自定義部落格,使它看起來更加的個性化。 一,準備工作   我的面板選擇的

RxJavaRxAndroid基礎入門

相關視訊: RxJava與RxAndroid基礎入門 相關文章: 給 Android 開發者的 RxJava 詳解 一起來造一個RxJava,揭祕RxJava的實現原理   RxJava 到底是什麼 一個詞:非同步。 RxJava 好在哪 一個詞:簡潔。 非同步

Dubbo() —— 基礎知識專案搭建

<!-- 1、指定當前服務/應用的名字(同樣的服務名字相同,不要和別的服務同名) --> <dubbo:application name="boot-user-service-provider"></dubbo:application>

Linux bash總結() 基礎部分(適合初學者學習非初學者參考)

歡迎使用Markdown編輯器 你好! 這是你第一次使用 Markdown編輯器 所展示的歡迎頁。如果你想學習如何使用Markdown編輯器, 可以仔細閱讀這篇文章,瞭解一下Markdown的基本語法知識。 新的改變 我們對Markdown編輯器進行了一些功能

springboot學習筆記():基礎程式配置

1 , springboot 介紹(來自百度百科) 簡介 微服務是一個新興的軟體架構,就是把一個大型的單個應用程式和服務拆分為數十個的支援微服務。一個微服務的策略可以讓工作變得更為簡便,它可擴充套件單個元件而不是整個的應用程式堆疊,從而滿足服務等級協議。

python基礎初識變數()

 -基礎     1.第一句Python       -字尾名是可以是任意       -匯入模組時,如果不是.py檔案       ==>以後檔案字尾名是 .py     2.兩種執行方式       Python直譯器 py檔案路徑       Python 進入直譯器       

Java多執行緒記憶體模型():程序執行緒基礎

Java多執行緒和記憶體模型(一) 由於java是執行在 JVM上 的,所以需要涉及到 JVM 的記憶體模型概念,需要理解記憶體模型,就需要多執行緒的基礎; 而執行緒是基於載體執行緒裡的,所以我們藉由作業系統的程序來講一講。 程序 什麼是程序?

Android響應式程式設計(RxJava前篇[入門基礎]

1.RxJava概述 ReactiveX與RxJava 在講到RxJava之前我們首先要了解什麼是ReactiveX,因為RxJava是ReactiveX的一種java實現。 ReactiveX是Reactive Extensions的縮寫,一般簡寫為

Novate:Retrofit2.0RxJava的又次完美改進加強(Tamic部落格 -CSDN)

作者/Tamic 前言 用過RxJava和Retrofit的朋友,用久了就會發現Retrofit說難不難,說簡不簡,對於實際專案中,單純的用Retrofit做請求庫,開發起來還是很多不便,必須請求頭和引數處理,API介面數目眾多時的處理,

android Java BASE64編碼解碼基礎

 今天在做Android專案的時候遇到一個問題,需求是向伺服器上傳一張圖片,要求把圖片轉化成圖片流放在 json字串裡傳輸。  類似這樣的: {"name":"jike","age":"20","pic