Android 專用響應式編程框架 — Agera

新人路過 8年前發布 | 22K 次閱讀 安卓開發 Android開發 移動開發

 

在響應式編程(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

 本文由用戶 新人路過 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!