android Agera(瑞典文的意思是”采取行动”)是一个超轻量级的Android库,帮助Android应用中有生命周期的组件(比如:Activities)或者组件中的对象(比如:Views)预准备数据。 通过加入函数式响应式编程,Agera可以在什么时机, 什么线程和什么数据层面上更清晰的分离数据处理流程,并且使用一个接近自然语言的单个表达式就能编写一个复杂的异步流。
一个Agera一些功能的例子,介绍Agera各个部分是如何工作的。
public class AgeraActivity extends Activity
implements Receiver<Bitmap>, Updatable {
private static final ExecutorService NETWORK_EXECUTOR =
newSingleThreadExecutor();
private static final ExecutorService DECODE_EXECUTOR =
newSingleThreadExecutor();
private static final String BACKGROUND_BASE_URL =
"http://www.gravatar.com/avatar/4df6f4fe5976df17deeea19443d4429d?s=";
private Repository<Result<Bitmap>> background;
private ImageView backgroundView;
@Override
protected void onCreate(final Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// Set the content view
setContentView(R.layout.activity_main);
// Find the background view
backgroundView = (ImageView) findViewById(R.id.background);
// 创建一个repository: 包括一个图片请求。Initially
// 初始值:absent, 配置通过网络获取屏幕大小的图片。
background = repositoryWithInitialValue(Result.<Bitmap>absent())
.observe() // 在这个例子中不需要刷新背景图,也就是不需要被观察者
.onUpdatesPerLoop() // 在这个例子中每次都更新
.getFrom(new Supplier<HttpRequest>() {
@NonNull
@Override
public HttpRequest get() {
DisplayMetrics displayMetrics = getResources().getDisplayMetrics();
int size = Math.max(displayMetrics.heightPixels,
displayMetrics.widthPixels);
return httpGetRequest(BACKGROUND_BASE_URL + size)
.compile();
}
}) // 实现带有显示大小参数的Http请求
.goTo(NETWORK_EXECUTOR) // 设置网络请求线程
.attemptTransform(httpFunction())
.orSkip() // 设置http请求,如果失败,跳过下面流程
.goTo(DECODE_EXECUTOR) // 设置解码线程
.thenTransform(new Function<HttpResponse, Result<Bitmap>>() {
@NonNull
@Override
public Result<Bitmap> apply(@NonNull HttpResponse response) {
byte[] body = response.getBody();
return absentIfNull(decodeByteArray(body, 0, body.length));
}
}) // 解码图片, 如果失败返回absent
.onDeactivation(SEND_INTERRUPT) // 中断线程
.compile(); // 创建repository
}
@Override
protected void onResume() {
super.onResume();
// 注册观察者,激活流程
background.addUpdatable(this);
}
@Override
protected void onPause() {
super.onPause();
// 注销观察者,去激活流程
background.removeUpdatable(this);
}
@Override
public void update() {
// repository更新时 调用
// 如果bitmap有效, 发送到下面的accept()方法
background.get().ifSucceededSendTo(this);
}
@Override
public void accept(@NonNull Bitmap background) {
// 设置背景图片
backgroundView.setImageBitmap(background);
}
}
Agera是一款轻量级Android库,支持组件如Activities及Views预加载数据。它利用函数式响应式编程来清晰地分离数据处理流程,简化复杂异步操作。本文介绍Agera的使用方式和组成部分。
323

被折叠的 条评论
为什么被折叠?



