简单使用Google Agera框架

作者: 阳春面 | 来源:发表于2016-04-28 22:42 被阅读1164次

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

    相关文章

      网友评论

        本文标题:简单使用Google Agera框架

        本文链接:https://www.haomeiwen.com/subject/jteglttx.html