搞定Android Agera-02

goto

默认是在当前线程执行,如果需要访问网络啥的,需要切换至work thread。由于是异步执行可能出现并发,提供了.onDeactivation(int) 和 .onConcurrentUpdate(int) 来取消任务。
不知道怎么切换至UI线程,update默认是切换回原来线程了。

    networkExecutor = Executors.newSingleThreadExecutor();

    mMutableRepository = Repositories.mutableRepository(mPagination);

    mLoadDataRepository = Repositories.repositoryWithInitialValue(Result.<>absent())
            .observe(mMutableRepository)
            .onUpdatesPerLoop()
            .goTo(networkExecutor)
            .attemptGetFrom(new GirlsSupplier(mMutableRepository)).orSkip()
            .onDeactivation(RepositoryConfig.SEND_INTERRUPT)
            .compile();

goLazy

Repository执行到goLazy时,停下来(其实是跳过指令),直到Repository.get()时候返回上一次的值,然后继续执行下面的指令。
有价值的场景:

1. 可能cancel的任务,减少了不必要的处理
2. 如果是异步执行,get会返回上一次的值
3. 同步执行就是顺序的哈,没有效果

  public synchronized Object get() {
    if (runState == PAUSED_AT_GO_LAZY) {
      int index = lastDirectiveIndex;
      runState = RUNNING_LAZILY;
      runFlowFrom(continueFromGoLazy(directives, index), false);
    }
    return currentValue;
  }

但是
mRepository.addUpdatable(this)会触发StartFlow(),就是一定会执行一次,这有卵用。

  @Override
  protected void observableActivated() {
    eventSource.addUpdatable(this);
    maybeStartFlow();
  }

Result and Receiver

可以比较好的处理异常情况

  result.ifSucceededSendTo(this)
        .ifFailedSendTo(new Receiver<Throwable>() {
            @Override
            public void accept(@NonNull Throwable value) {
                
            }
        });

GitHub地址

AndroidAgeraTutorial

发表评论

电子邮件地址不会被公开。 必填项已用*标注