在响应式编程(Reactive programming)这么热的今天,Google 也耐不住寂寞了,周末 Google 开源了他们在 Google Play Movies 项目中内部使用的 Android 专用的响应式编程框架 — Agera 。 Agera 和 RxJava 没有任何关系,只是 响应式编程 在 Android 平台上的轻量级实现。
下面是一个示例:
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); } }
更多详情请参考官方网站: https://github.com/google/agera
后续本站也会详细介绍其使用文档。