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>