转载

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

在响应式编程(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

后续本站也会详细介绍其使用文档。

原文  http://blog.chengyunfeng.com/?p=973
正文到此结束
Loading...