<pre id="z8nfa"></pre>

<acronym id="z8nfa"><strong id="z8nfa"></strong></acronym><pre id="z8nfa"></pre>
<track id="z8nfa"></track>
  • <acronym id="z8nfa"><strong id="z8nfa"><listing id="z8nfa"></listing></strong></acronym>
  • 
    
    <p id="z8nfa"></p>
      鍍金池/ 教程/ 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

      上一篇所講, 被觀察者(Observable)作為事件源,觀察者(updatable)監聽(觀察)事件。

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

      注銷觀察者(Updatable)方法:Observable.removeUpdatable(Updatable)

      事件分發給觀察者(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的注冊和注銷必須配對使用。不能重復注冊Updatable,不能注銷沒有注冊過的Updatable,也不能重復注銷Updatable,等其他非法操作。

      Activation lifecycle and event chain

      被觀察者(Observable)的狀態:
      _active_狀態(活動狀態):有觀察者 (至少注冊一個了Updatable)
      _inactive_狀態(非活動狀態):沒有觀察者 (沒有注冊的Updatable)

      也就是, 注冊Updatable讓Observable從非活動狀態激活為活動狀態,當Updatable全部注銷了,Observable從活動狀態變為非活動狀態。

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

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

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

      這就是說,在下游方向上的強引用只用于注冊/注銷觀察者(Updatable),這也意味著,在最下游的觀察者(Updatable)(那些不被中間位置的被觀察者管理的被觀察者們) 最終控制所有觀察者(Updatable)的活動和非活動狀態。

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

      UI lifecycle

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

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

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

      在UI元素生命周期結束時,同一個數據倉庫(Repository)注銷觀察者(Updatable),假設所有觀察者(Updatable)都被注銷,那么事件鏈將級聯斷開。

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

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

      Threading

      Agera 推薦指明執行線程, 使用Loopers(Looper在Android中大量存在, 比如:APP Main Looper 和 IntentService中)來定義下面的線程約定。

      為了處理內部狀態生命周期,每一個觀察者(Updatable)在生命周期內都關聯一個有Looper的線程(worker Looper thread),有Looper的線程就是實例化被觀察者(Observable)的線程。

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

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

      被觀察者(Observable)會使用相同Looper的線程的分發Updatable.update()。

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

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

      上一篇:Compiled functions下一篇:Repositories
      无码丰满熟妇一区二区蜜臀Av
      <pre id="z8nfa"></pre>

      <acronym id="z8nfa"><strong id="z8nfa"></strong></acronym><pre id="z8nfa"></pre>
      <track id="z8nfa"></track>
    1. <acronym id="z8nfa"><strong id="z8nfa"><listing id="z8nfa"></listing></strong></acronym>
    2. 
      
      <p id="z8nfa"></p>