android java 堆栈_android

我没有找到任何优雅的native-RxJava解决方案。 所以我会定制一个Subscriber来完成你的工作。

对于你的3分:

对于顺序执行,我们创建一个单线程调度程序

Scheduler sequential = Schedulers.from(Executors.newFixedThreadPool(1));

为了在发生错误时停止所有请求,我们应该一起订阅所有请求,而不是每次都创建一个Flowable 。 所以我们定义了以下函数(这里我请求的是Integer和response String ):

void sendRequest(Integer request)

Flowable reciveResponse()

并定义一个字段以建立请求和响应流的关联:

FlowableProcessor requestQueue = UnicastProcessor.create();

为了重新运行未发送的请求,我们定义了重新运行功能:

void rerun()

然后我们可以使用它:

reciveResponse().subscribe(/**your subscriber**/)

现在让我们实施它们。

发送请求时,我们只需将其推送到requestQueue

public void sendRequest(Integer request) {

requestQueue.onNext(request);

}

首先,要按顺序执行请求,我们应该将工作安排到sequential :

requestQueue

.observeOn(sequential)

.map(i -> mockLongTimeRequest(i)) // mock for your serverApi.process

.observeOn(AndroidSchedulers.mainThread());

第二,在发生错误时停止请求。 这是默认行为。 如果我们什么都不做,则错误将导致订阅中断,并且不会发出任何更多项目。

第三,重新运行未发送的请求。 首先是因为本机运算符将取消流,如MapSubscriber do(RxJava-2.1.0-FlowableMap#63):

try {

v = ObjectHelper.requireNonNull(mapper.apply(t), "The mapper function returned a null value.");

} catch (Throwable ex) {

fail(ex);// fail will call cancel

return;

}

我们应该包装错误。 这里我使用我的Try类来包装可能的异常,你可以使用任何其他可以包装异常的实现而不是抛出它:

.map(i -> Try.to(() -> mockLongTimeRequest(i)))

然后是自定义OnErrorStopSubscriber implements Subscriber>, Subscription 。

它通常会请求和发出物品。 当发生错误时(实际上是一个失败的Try发出)它停在那里并且不会请求或发出甚至下游请求它。 调用rerun方法后,它将返回正在运行的statu并正常发出。 这节课大约有80行。 你可以在我的github上看到代码。

现在我们可以测试我们的代码:

public static void main(String[] args) throws InterruptedException {

Q47264933 q = new Q47264933();

IntStream.range(1, 10).forEach(i -> q.sendRequest(i));// emit 1 to 10

q.reciveResponse().subscribe(e -> System.out.println("\tdo for: " + e));

Thread.sleep(10000);

q.rerun(); // re-run after 10s

Thread.sleep(10000);// wait for it complete because the worker thread is deamon

}

private String mockLongTimeRequest(int i) {

Thread.sleep((long) (1000 * Math.random()));

if (i == 5) {

throw new RuntimeException(); // error occur when request 5

}

return Integer.toString(i);

}

并输出:

1 start at:129

1 done at:948

2 start at:950

do for: 1

2 done at:1383

3 start at:1383

do for: 2

3 done at:1778

4 start at:1778

do for: 3

4 done at:2397

5 start at:2397

do for: 4

error happen: java.lang.RuntimeException

6 start at:10129

6 done at:10253

7 start at:10253

do for: 6

7 done at:10415

8 start at:10415

do for: 7

8 done at:10874

9 start at:10874

do for: 8

9 done at:11544

do for: 9

你可以看到它顺序运行。 并在发生错误时停止。 在调用rerun方法后,它继续处理左未发送请求。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值