google最近開源了agera框架,
這是一個(gè)類似于RxJava的函數(shù)式編程框架, 使用時(shí)大概就是 push event/pull data的模式蹂风。
我參考官方的Samples,改寫了[MaterialDesignExample]獲取豆瓣書籍的功能吼蚁。
實(shí)現(xiàn)BooksSupplier
Agera中我們需要實(shí)現(xiàn)的Supplier接口刺下,獲取書籍?dāng)?shù)據(jù)
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方法指定獲取數(shù)據(jù)執(zhí)行的線程
使用thenGetFrom方法指定獲取數(shù)據(jù)的Supplier
這里我們還使用了observe方法指定了一個(gè)searchObservable免绿,后續(xù)我們可以使用searchObservable來發(fā)起事件調(diào)用浸剩。
發(fā)起事件調(diào)用(push event)
@Override
public void onResume() {
super.onResume();
booksRepository.addUpdatable(this);
}
在onResume中使用booksRepository的addUpdatable方法,就會實(shí)際發(fā)起事件調(diào)用娄涩,同時(shí)我們也可以使用searchObservable的dispatchUpdate發(fā)起事件調(diào)用:
private void doSearch(String keyword) {
mProgressBar.setVisibility(View.VISIBLE);
mAdapter.clearItems();
searchObservable.doSearch(keyword);
}
處理調(diào)用結(jié)果(pull data)
處理調(diào)用結(jié)果我們需要實(shí)現(xiàn)Updatable接口蒲肋,事件處理完成后會回調(diào)Updatable的update() 方法,通過booksRepository.addUpdatable(this)
方法已經(jīng)把當(dāng)前的Fragment作為Updatable钝满,所以需要實(shí)現(xiàn)這個(gè)接口的方法:
@Override
public void update() {
mProgressBar.setVisibility(View.GONE);
startFABAnimation();
if (booksRepository.get().isPresent()) {
mAdapter.updateItems(booksRepository.get().get(), true);
}
}
Updatable是在主線程里回調(diào)的兜粘,所以可以在其中進(jìn)行UI相關(guān)的操作。
總結(jié)
這次只是對Agera框架簡單的初步使用弯蚜,里面的很多東西還是不熟悉孔轴,
個(gè)人感覺Agera使用起來代碼結(jié)構(gòu)清晰,但是在實(shí)際項(xiàng)目中使用還是略顯繁瑣碎捺。