Android 专用响应式编程框架 — Agera

新人路过 9年前
   <p> </p>    <p>在响应式编程(Reactive programming)这么热的今天,Google 也耐不住寂寞了,周末 Google 开源了他们在 Google Play Movies 项目中内部使用的 Android 专用的响应式编程框架 — <a href="/misc/goto?guid=4959671503275709034" rel="nofollow,noindex">Agera</a> 。 Agera 和 RxJava 没有任何关系,只是 <a href="/misc/goto?guid=4958979542149358570" rel="nofollow,noindex">响应式编程</a> 在 Android 平台上的轻量级实现。</p>    <p>下面是一个示例:</p>    <pre>  <code class="language-java">public class AgeraActivityextends Activity      implements Receiver<Bitmap>, Updatable {    private static final ExecutorServiceNETWORK_EXECUTOR =        newSingleThreadExecutor();    private static final ExecutorServiceDECODE_EXECUTOR =        newSingleThreadExecutor();    private static final String BACKGROUND_BASE_URL =        "http://www.gravatar.com/avatar/4df6f4fe5976df17deeea19443d4429d?s=";       private Repository<Result<Bitmap>> background;    private ImageViewbackgroundView;       @Override    protected void onCreate(final BundlesavedInstanceState) {      super.onCreate(savedInstanceState);      // Set the content view      setContentView(R.layout.activity_main);         // Find the background view      backgroundView = (ImageView) findViewById(R.id.background);         // Create a repository containing the result of a bitmap request. Initially      // absent, but configured to fetch the bitmap over the network based on      // display size.      background = repositoryWithInitialValue(Result.<Bitmap>absent())          .observe() // Optionally refresh the bitmap on events. In this case never          .onUpdatesPerLoop() // Refresh per Looper thread loop. In this case never          .getFrom(new Supplier<HttpRequest>() {            @NonNull            @Override            public HttpRequestget() {              DisplayMetricsdisplayMetrics = getResources().getDisplayMetrics();              int size = Math.max(displayMetrics.heightPixels,                  displayMetrics.widthPixels);              return httpGetRequest(BACKGROUND_BASE_URL + size)                  .compile();            }          }) // Supply an HttpRequest based on the display size          .goTo(NETWORK_EXECUTOR) // Change execution to the network executor          .attemptTransform(httpFunction())          .orSkip() // Make the actual http request, skip on failure          .goTo(DECODE_EXECUTOR) // Change execution to the decode executor          .thenTransform(new Function<HttpResponse, Result<Bitmap>>() {            @NonNull            @Override            public Result<Bitmap> apply(@NonNull HttpResponseresponse) {              byte[] body = response.getBody();              return absentIfNull(decodeByteArray(body, 0, body.length));            }          }) // Decode the response to the result of a bitmap, absent on failure          .onDeactivation(SEND_INTERRUPT) // Interrupt thread on deactivation          .compile(); // Create the repository    }       @Override    protected void onResume() {      super.onResume();      // Start listening to the repository, triggering the flow      background.addUpdatable(this);    }       @Override    protected void onPause() {      super.onPause();      // Stop listening to the repository, deactivating it      background.removeUpdatable(this);    }       @Override    public void update() {      // Called as the repository is updated      // If containing a valid bitmap, send to accept below      background.get().ifSucceededSendTo(this);    }       @Override    public void accept(@NonNull Bitmapbackground) {      // Set the background bitmap to the background view      backgroundView.setImageBitmap(background);    }  }     </code></pre>    <p>更多详情请参考官方网站: https://github.com/google/agera</p>    <p>后续本站也会详细介绍其使用文档。</p>    <p>来自: <a href="/misc/goto?guid=4959671516253850611" rel="nofollow">http://blog.chengyunfeng.com/?p=973</a></p>