google最近开源了agera框架,
这是一个类似于RxJava的函数式编程框架, 使用时大概就是 push event/pull data的模式。
我参考官方的Samples,改写了[MaterialDesignExample]获取豆瓣书籍的功能。
实现BooksSupplier
Agera中我们需要实现的Supplier接口,获取书籍数据
private List<Book> getBooks() {
HttpUrl url = HttpUrl.parse(getAbsoluteUrl("book/search"))
.newBuilder()
.addQueryParameter("q", key)
.addQueryParameter("start", "0")
.addQueryParameter("end", "50")
.build();
Request request = new Request.Builder()
.url(url)
.build();
try {
Response response = client.newCall(request).execute();
JSONObject json = new JSONObject(response.body().string());
JSONArray jaBooks = json.optJSONArray("books");
Gson gson = new Gson();
List<Book> books = gson.fromJson(jaBooks.toString(), new TypeToken<List<Book>>() {
}.getType());
return books;
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
@NonNull
@Override
public Result<List<Book>> get() {
List<Book> books = getBooks();
if (books == null) {
return Result.failure();
} else {
return Result.success(books);
}
}
初始化Repository
public class SearchObservable extends BaseObservable {
public void doSearch(String key) {
booksSupplier.setKey(key);
dispatchUpdate();
}
}
private void setUpRepository() {
// Set up background executor
networkExecutor = newSingleThreadExecutor();
searchObservable = new SearchObservable();
booksSupplier = new BooksSupplier(getString(R.string.default_search_keyword));
// Set up books repository
booksRepository = Repositories
.repositoryWithInitialValue(Result.<List<Book>>absent())
.observe(searchObservable)
.onUpdatesPerLoop()
.goTo(networkExecutor)
.thenGetFrom(booksSupplier)
.compile();
}
使用goTo方法指定获取数据执行的线程
使用thenGetFrom方法指定获取数据的Supplier
这里我们还使用了observe方法指定了一个searchObservable,后续我们可以使用searchObservable来发起事件调用。
发起事件调用(push event)
@Override
public void onResume() {
super.onResume();
booksRepository.addUpdatable(this);
}
在onResume中使用booksRepository的addUpdatable方法,就会实际发起事件调用,同时我们也可以使用searchObservable的dispatchUpdate发起事件调用:
private void doSearch(String keyword) {
mProgressBar.setVisibility(View.VISIBLE);
mAdapter.clearItems();
searchObservable.doSearch(keyword);
}
处理调用结果(pull data)
处理调用结果我们需要实现Updatable接口,事件处理完成后会回调Updatable的update() 方法,通过booksRepository.addUpdatable(this)
方法已经把当前的Fragment作为Updatable,所以需要实现这个接口的方法:
@Override
public void update() {
mProgressBar.setVisibility(View.GONE);
startFABAnimation();
if (booksRepository.get().isPresent()) {
mAdapter.updateItems(booksRepository.get().get(), true);
}
}
Updatable是在主线程里回调的,所以可以在其中进行UI相关的操作。
总结
这次只是对Agera框架简单的初步使用,里面的很多东西还是不熟悉,
个人感觉Agera使用起来代码结构清晰,但是在实际项目中使用还是略显繁琐。