<thead id="x9djr"></thead>
    <thead id="x9djr"><i id="x9djr"></i></thead>
    <thead id="x9djr"><i id="x9djr"></i></thead><menuitem id="x9djr"><ruby id="x9djr"><noframes id="x9djr">
    <var id="x9djr"></var>
    <var id="x9djr"><dl id="x9djr"><address id="x9djr"></address></dl></var> <menuitem id="x9djr"></menuitem>
    <menuitem id="x9djr"></menuitem>
    <menuitem id="x9djr"></menuitem>
    <menuitem id="x9djr"><ruby id="x9djr"></ruby></menuitem><menuitem id="x9djr"></menuitem><thead id="x9djr"></thead>
    <menuitem id="x9djr"><ruby id="x9djr"><th id="x9djr"></th></ruby></menuitem>
    鍍金池/ 教程/ Android/ Reservoirs and parallelism
    Custom observables
    Compiled functions
    Reactive programming
    Reservoirs and parallelism
    Incrementally Agerifying legacy code
    Observables and updatables
    Compiled repositories
    Repositories

    Reservoirs and parallelism

    由于_push event, pull data_模型和多線程情況下,觀察者可能看不到數據全部的更新記錄(ps:因為總是獲取最新的數據)。這是特意設計的: 因為大多數情況下(尤其更新app UI), 本來就只需要關心最新的數據。 然而, 如果客戶端(一般很少)想知道全部的變化歷史記錄, Agera 提供Repository的子類型: Reservoir,可以滿足這種場景。

    Reservoir是一個響應版本隊列。數據可以通過Receiver接口加入隊列,然后發起通知事件,然后觀察者可以從隊列中讀取數據(Repository.get())。

    Reservoir隊列的訪問是完全同步的,所以不會出現兩個客戶端從隊列中讀取到同一個數據(ps:就是線程安全)。 如果相同的值放入隊列多次,這也會認為是不同的實例(ps:就是會生成多次通知事件)。

    if the same value (the same Java object reference) is enqueued multiple times, they are different instances in the context of a reservoir).

    返回數據類型是Result, 所以如果客戶端嘗試從空隊列讀取數據的時候,可以接收Result.absent()作為一個失敗的通知。

    基于這種行為,Reservoir非常適合必須處理事件源的每一個數據的響應。 這種響應可以使用[[compiled repository|Compiled-repositories]]實現。

    如果合適的話,可以用Reservoir作為事件源,使用.attemptGetFrom(reservoir).orSkip()作為數據處理流程的開始指令。

    一旦repository激活,Reservoir中的觀察者模式就會建立好(ps:消費者和生產者的模式)。

    使用Reservoir可以實現簡單的并行任務,使用多個repository提供事件源和數據源,任務放入隊列,然后每個repository去執行數據處理流程。

    注意:為了做到并行執行,repository都需要提交到線程池執行或者運行在不同的工作Looper(worker Loopers)。

    上一篇:Repositories
    九九热这里只有精品,996热RE视频精品视频成人