简单使用Google Agera框架

96
作者 阳春面
2016.04.28 22:42 字数 569

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使用起来代码结构清晰,但是在实际项目中使用还是略显繁琐。

Android