<wbr id="jl7f7"></wbr>

        <i id="jl7f7"></i>
          <acronym id="jl7f7"></acronym>

          <s id="jl7f7"></s>

          <ins id="jl7f7"></ins><button id="jl7f7"><strong id="jl7f7"></strong></button>
          鍍金池/ 教程/ Android/ Observables and updatables
          Custom observables
          Compiled functions
          Reactive programming
          Reservoirs and parallelism
          Incrementally Agerifying legacy code
          Observables and updatables
          Compiled repositories
          Repositories

          Observables and updatables

          上一篇所講, 被觀(guān)察者(Observable)作為事件源,觀(guān)察者(updatable)監聽(tīng)(觀(guān)察)事件。

          注冊觀(guān)察者(Updatable)方法:Observable.addUpdatable(Updatable)

          注銷(xiāo)觀(guān)察者(Updatable)方法:Observable.removeUpdatable(Updatable)

          事件分發(fā)給觀(guān)察者(Updatable)方法:Updatable.update()
          在activity中的用法舉例:

          public class MyUpdatableActivity extends Activity implements Updatable {
            private Observable observable;
          
            @Override
            protected void onCreate(Bundle savedInstanceState) {
              super.onCreate(savedInstanceState);
              observable = new MyObservable();
            }
          
            @Override
            public void update() {
              // 事件通知 處理
            }
          
            @Override
            protected void onResume() {
              super.onResume();
              observable.addUpdatable(this);
              update();
            }
          
            @Override
            protected void onPause() {
              super.onPause();
              observable.removeUpdatable(this);
            }
          }

          Updatable的注冊和注銷(xiāo)必須配對使用。不能重復注冊Updatable,不能注銷(xiāo)沒(méi)有注冊過(guò)的Updatable,也不能重復注銷(xiāo)Updatable,等其他非法操作。

          Activation lifecycle and event chain

          被觀(guān)察者(Observable)的狀態(tài):
          _active_狀態(tài)(活動(dòng)狀態(tài)):有觀(guān)察者 (至少注冊一個(gè)了Updatable)
          _inactive_狀態(tài)(非活動(dòng)狀態(tài)):沒(méi)有觀(guān)察者 (沒(méi)有注冊的Updatable)

          也就是, 注冊Updatable讓Observable從非活動(dòng)狀態(tài)激活為活動(dòng)狀態(tài),當Updatable全部注銷(xiāo)了,Observable從活動(dòng)狀態(tài)變?yōu)榉腔顒?dòng)狀態(tài)。

          http://wiki.jikexueyuan.com/project/agera-wiki-cn/images/observablelifecycle.png" alt="" />

          被觀(guān)察者(Observable)還可以觀(guān)察其它“上游”(事件傳播路徑)的被觀(guān)察者們(Observables),把它們的事件轉換成自己的事件。 一個(gè)常見(jiàn)的例子:一個(gè)數據倉庫(Repository),它的數據依賴(lài)另一個(gè)數據倉庫(Repository)的數據。

          為了事件傳播路徑的正確性, 處于中間位置的被觀(guān)察者(Observable)一般持有上游被觀(guān)察者(Observable)的強引用, 通常當自己激活的時(shí)候向上游注冊觀(guān)察者(Updatable), 當自己非活動(dòng)的時(shí)候向上游注銷(xiāo)觀(guān)察者(Updatable)。

          這就是說(shuō),在下游方向上的強引用只用于注冊/注銷(xiāo)觀(guān)察者(Updatable),這也意味著(zhù),在最下游的觀(guān)察者(Updatable)(那些不被中間位置的被觀(guān)察者管理的被觀(guān)察者們) 最終控制所有觀(guān)察者(Updatable)的活動(dòng)和非活動(dòng)狀態(tài)。

          http://wiki.jikexueyuan.com/project/agera-wiki-cn/images/downstream.png" alt="" />

          UI lifecycle

          事件鏈在構建有生命周期UI的響應式架構方面非常有用。UI元素比如Activity、Fragment、其中的View, Android生命周期中定義的成對狀態(tài)變化,比如:onStart 到 onStop,onResume 到 onPause,onAttachedToWindow 到 onDetachedFromWindow 等等。

          讓UI元素成為或者擁有一個(gè)觀(guān)察者(Updatable),通過(guò)從數據倉庫(Repository)獲取數據來(lái)更新UI。反過(guò)來(lái)數據倉庫(Repository)可以使用其他的事件源和數據源(不一定是Repository)來(lái)計算自己的數據。

          在UI元素生命周期的開(kāi)始,注冊觀(guān)察者(Updatable),然后數據倉庫(Repository)處于活動(dòng)狀態(tài)。這將連接事件鏈,激活所有相關(guān)的數據處理流程,保持數據和UI是最新的。

          在UI元素生命周期結束時(shí),同一個(gè)數據倉庫(Repository)注銷(xiāo)觀(guān)察者(Updatable),假設所有觀(guān)察者(Updatable)都被注銷(xiāo),那么事件鏈將級聯(lián)斷開(kāi)。

          如果UI元素是不會(huì )再激活(例如activity.onDestroyed()),因為當前系統不活動(dòng)了沒(méi)有下游的引用,UI元素可以被垃圾回收,因此很容易預防Activity泄漏。

          http://wiki.jikexueyuan.com/project/agera-wiki-cn/images/uilifecycle.png" alt="" />

          Threading

          Agera 推薦指明執行線(xiàn)程, 使用Loopers(Looper在A(yíng)ndroid中大量存在, 比如:APP Main Looper 和 IntentService中)來(lái)定義下面的線(xiàn)程約定。

          為了處理內部狀態(tài)生命周期,每一個(gè)觀(guān)察者(Updatable)在生命周期內都關(guān)聯(lián)一個(gè)有Looper的線(xiàn)程(worker Looper thread),有Looper的線(xiàn)程就是實(shí)例化被觀(guān)察者(Observable)的線(xiàn)程。

          被觀(guān)察者(Observable)的注冊和注銷(xiāo)事件分發(fā)都是通過(guò)Looper。如果被觀(guān)察者觀(guān)察了其它被觀(guān)察者,它內部的被觀(guān)察者(Observable)將會(huì )從當前線(xiàn)程注冊到上游的觀(guān)察者(Updatable)。

          被觀(guān)察者(Observable)必須在有Looper的線(xiàn)程上注冊觀(guān)察者(Updatable),觀(guān)察者(Updatable)和被觀(guān)察者(Observable)可以運行在不同的線(xiàn)程。

          被觀(guān)察者(Observable)會(huì )使用相同Looper的線(xiàn)程的分發(fā)Updatable.update()。

          注銷(xiāo)觀(guān)察者(Updatable)可以在任何線(xiàn)程, 但為了避免觀(guān)察者注銷(xiāo)后,事件被分發(fā)在內部形成競爭條件, 推薦注冊和注銷(xiāo)觀(guān)察者(Updatable)在同一個(gè)線(xiàn)程完成。

          開(kāi)發(fā)者有責任保證Looper的存活和被觀(guān)察者們(Observables)一樣。由于Looper導致的異常和內存泄漏是開(kāi)發(fā)者的責任。 然而在實(shí)踐中,絕大多數情況下都是使用主線(xiàn)程Looper,而主線(xiàn)程是隨app一直存活著(zhù)。

          上一篇:Compiled functions下一篇:Repositories
          日韩性做爰免费a片aa片,天天躁恨恨躁夜躁2020,精品久久综合1区2区3区激情,精产国品一二三产品麻豆

          <wbr id="jl7f7"></wbr>

                <i id="jl7f7"></i>
                  <acronym id="jl7f7"></acronym>

                  <s id="jl7f7"></s>

                  <ins id="jl7f7"></ins><button id="jl7f7"><strong id="jl7f7"></strong></button>