RxJava使用takeUntil操作實(shí)現(xiàn)生命周期的綁定

相信使用過RxJavaRxAndroid的人都會被其簡便的流式操作所吸引李滴,結(jié)合java8的lambda表達(dá)式螃宙,使代碼看起來更簡潔,操作邏輯更清晰悬嗓,數(shù)據(jù)處理更便捷污呼,告別了臃腫的代碼。但要優(yōu)雅的使用它還需要進(jìn)行一些處理包竹,避免操作不當(dāng)導(dǎo)致的內(nèi)存泄漏風(fēng)險(xiǎn)燕酷。


管理訂閱的幾種方式
  • 使用CompositeSubscription統(tǒng)一管理生命周期(后面具體講解實(shí)現(xiàn)方式)
  • 使用RxLifecycle來管理訂閱,實(shí)現(xiàn)和Android組件的生命周期綁定周瞎。
  • 使用takeUntil操作符結(jié)合BehaviorSubject實(shí)現(xiàn)生命周期綁定苗缩。

具體介紹

一、使用CompositeSubscription統(tǒng)一管理生命周期
public class BaseActivity extends AppCompatActivity {    
    protected CompositeSubscription subscription = new   CompositeSubscription();    
    protected void addSub(Subscription sub) {        
        if (sub != null && !sub.isUnsubscribed()) {                   
          subscription.add(sub);       
     }   
 }    
@Override   
protected void onDestroy() {     
     if(subscription.hasSubscriptions()){          
          subscription.unsubscribe();        
    }        
    super.onDestroy();   
 }
}

在子類統(tǒng)一調(diào)用addSub方法將生成的訂閱關(guān)系添加進(jìn)subscription管理類中声诸,在onDestroy中統(tǒng)一取消訂閱關(guān)系酱讶。

二、使用RxLifecycle來管理訂閱(需要引入新的類庫)

這里不進(jìn)行詳細(xì)描述彼乌,具體操作參照Rxlifecycle使用詳解

三泻肯、使用takeUntil操作符結(jié)合BehaviorSubject實(shí)現(xiàn)生命周期綁定

具體代碼實(shí)現(xiàn):

//這里提供的是kotlin的實(shí)現(xiàn)
class MainActivity : AppCompatActivity() {    
  var subject: BehaviorSubject<Event> = BehaviorSubject.create()    
  val TAG = MainActivity::class.java!!.simpleName    
  override fun onCreate(@Nullable savedInstanceState: Bundle?) {   
              super.onCreate(savedInstanceState)        
              setContentView(R.layout.activity_main)       
     var sub = Observable.interval(1, TimeUnit.SECONDS)
    .compose(this.bindLife<Long>())
    .subscribe({ a -> Log.i(TAG, "call: " + a!!) },
    { t -> Log.e(TAG, "call: " + t.message!!) }                       
   , { Log.i(TAG, "complete: 完成") })
}    

  fun <T> bindLife(): Observable.Transformer<T, T> { 
    return Observable.Transformer<T, T> {           
     observable -> observable.takeUntil(subject.skipWhile(
    {event ->event != Event.PAUSE && event != Event.DESTROY
    && event != Event.DETACH }))}    
  }   
 
  override fun onDestroy() { 
    subject.onNext(Event.DESTROY)
    super.onDestroy()    
  }
}

enum class Event {    
// Activity life Events    
  CREATE,   
  START,  
  RESUME,  
  PAUSE,  
  STOP,   
  DESTROY,    
// Fragment life  Events  
  ATTACH, 
  CREATE_VIEW,  
  DESTROY_VIEW,  
  DETACH
}

java版本(非lambda)

/**
 * ClassName: BaseActivity<p>
 * Author: Alpha<p>
 * Fuction: <p>
 * CreateDate: 2016/7/3 0:17<p>
 */
public class BaseActivity extends AppCompatActivity {

    protected BehaviorSubject<Event> subject = BehaviorSubject.create();

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        Observable.interval(3, TimeUnit.SECONDS)
                .compose(this.<Long>bindLife())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(new Subscriber<Long>() {
                    @Override
                    public void onCompleted() {
                        Log.i("rxjava", "onCompleted");

                        Toast.makeText(BaseActivity.this, "onCompleted", Toast.LENGTH_SHORT).show();

                    }

                    @Override
                    public void onError(Throwable e) {

                    }

                    @Override
                    public void onNext(final Long aLong) {
                        Log.i("rxjava", "onNext " + aLong);

                        Toast.makeText(BaseActivity.this, "aLong:" + aLong, Toast.LENGTH_SHORT).show();
                    }
                });
    }

    protected <T> Observable.Transformer<T, T> bindLife() {
        return new Observable.Transformer<T, T>() {
            @Override
            public Observable<T> call(Observable<T> observable) {
                return observable.takeUntil(subject.skipWhile(new Func1<Event, Boolean>() {
                    @Override
                    public Boolean call(Event event) {
                        return event != Event.DESTROY && event != Event.DETACH;
                    }
                }));
            }
        };
    }

    @Override
    protected void onDestroy() {
        subject.onNext(Event.DESTROY);
        super.onDestroy();
    }
}

未處理之前.gif
處理之后.gif

鳴謝:#Kotlin# 小心 Rx 的生命周期

感謝大家的支持,如有不足之處希望大家提出來慰照,一起交流進(jìn)步灶挟。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市毒租,隨后出現(xiàn)的幾起案子稚铣,更是在濱河造成了極大的恐慌,老刑警劉巖墅垮,帶你破解...
    沈念sama閱讀 222,252評論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件惕医,死亡現(xiàn)場離奇詭異,居然都是意外死亡算色,警方通過查閱死者的電腦和手機(jī)抬伺,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,886評論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來灾梦,“玉大人沛简,你說我怎么就攤上這事〕夥希” “怎么了椒楣?”我有些...
    開封第一講書人閱讀 168,814評論 0 361
  • 文/不壞的土叔 我叫張陵,是天一觀的道長牡肉。 經(jīng)常有香客問我捧灰,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,869評論 1 299
  • 正文 為了忘掉前任毛俏,我火速辦了婚禮炭庙,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘煌寇。我一直安慰自己焕蹄,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,888評論 6 398
  • 文/花漫 我一把揭開白布阀溶。 她就那樣靜靜地躺著腻脏,像睡著了一般。 火紅的嫁衣襯著肌膚如雪银锻。 梳的紋絲不亂的頭發(fā)上永品,一...
    開封第一講書人閱讀 52,475評論 1 312
  • 那天,我揣著相機(jī)與錄音击纬,去河邊找鬼鼎姐。 笑死,一個(gè)胖子當(dāng)著我的面吹牛更振,可吹牛的內(nèi)容都是我干的炕桨。 我是一名探鬼主播,決...
    沈念sama閱讀 41,010評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼肯腕,長吁一口氣:“原來是場噩夢啊……” “哼献宫!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起乎芳,我...
    開封第一講書人閱讀 39,924評論 0 277
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎帖池,沒想到半個(gè)月后奈惑,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,469評論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡睡汹,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,552評論 3 342
  • 正文 我和宋清朗相戀三年肴甸,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片囚巴。...
    茶點(diǎn)故事閱讀 40,680評論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡原在,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出彤叉,到底是詐尸還是另有隱情庶柿,我是刑警寧澤,帶...
    沈念sama閱讀 36,362評論 5 351
  • 正文 年R本政府宣布秽浇,位于F島的核電站浮庐,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏柬焕。R本人自食惡果不足惜审残,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,037評論 3 335
  • 文/蒙蒙 一梭域、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧搅轿,春花似錦病涨、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,519評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至沸柔,卻和暖如春循衰,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背褐澎。 一陣腳步聲響...
    開封第一講書人閱讀 33,621評論 1 274
  • 我被黑心中介騙來泰國打工会钝, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人工三。 一個(gè)月前我還...
    沈念sama閱讀 49,099評論 3 378
  • 正文 我出身青樓迁酸,卻偏偏與公主長得像,于是被迫代替她去往敵國和親俭正。 傳聞我的和親對象是個(gè)殘疾皇子奸鬓,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,691評論 2 361

推薦閱讀更多精彩內(nèi)容