java 执行长事物_如何在RXJava Android中对后台线程执行长计算

我想在android中使用RXJava在后台线程上执行长计算.计算后,我试图在Recylerview中呈现结果.我正在使用以下代码:

Observable.just("true")

.subscribeOn(Schedulers.io())

.map(new Func1() {

@Override

public String call(String s) {

feedlist.clear();

if (eventFeedItems != null && !eventFeedItems.isEmpty()) {

for (int i = 0; i < eventFeedItems.size(); i++) {

if (eventFeedItems != null && eventFeedItems.get(i) != null

&& ((eventFeedItems.get(i).getType() != null && eventFeedItems.get(i).getType().equalsIgnoreCase("EVENT"))

|| (eventFeedItems.get(i).getActivityRequestType() != null && eventFeedItems.get(i).getActivityRequestType().equalsIgnoreCase(EventConstants.TRENDING_ACTIVITY)))) {

if (eventFeedItems.get(i).getActivityRequestType() != null && !eventFeedItems.get(i).getActivityRequestType().equalsIgnoreCase("")) {

feedlist.add(new FeedsListModel(eventFeedItems.get(i), eventFeedItems.get(i).getActivityRequestType(), null));

} else if (eventFeedItems.get(i).getRequestType() != null && !eventFeedItems.get(i).getRequestType().equalsIgnoreCase("")) {

feedlist.add(new FeedsListModel(eventFeedItems.get(i), eventFeedItems.get(i).getRequestType(), null));

} else

feedlist.add(new FeedsListModel(eventFeedItems.get(i), EventConstants.ATTENDEE_POST, null));

}

}

}

Log.d("calculations","Completed");

return "";

}

})

.observeOn(AndroidSchedulers.mainThread())

.subscribe(new Action1() {

@Override

public void call(String s) {

// feed_list.setLayoutManager(mLayoutManager);

// feedListAdapter.notifyDataSetChanged();

Log.d("Adapter", "Set");

}

}, new Action1() {

@Override

public void call(Throwable throwable) {

Log.d("Exception", "oh! fish...");

throwable.printStackTrace();

}

});

上面的代码使我面临UI障碍,因为ArrayList eventFeedItems的大小大约超过300个项目.我是RXJava的新手.请帮帮我.

解决方法:

您将无法使用map-Operator实现并发.

第一个subscriptionOn会将所有发射移至IO调度器.这里没有并发发生.

.subscribeOn(Schedulers.io())

映射操作符将从上一个线程同步调用.在您的情况下,它将是IO线程池中的某个线程.

.map(new Func1() {

执行完map-Operator后,您可以使用以下命令将值从IO线程移至Android-UI-event-loop

.observeOn(AndroidSchedulers.mainThread())

将值从IO线程转换为UI线程后,将处理初始可观察值中的下一个值.

Observable.just("true")

在您的示例中,将不再有任何值,因为您只产生一个值.

为了实现并发,您应该使用flatMap而不是map.并在flatMap中使用subscriptionOn()在另一个线程上创建每个流.

请考虑以下示例,以了解并发情况.每个可观察对象将被立即订阅,因此最大值训练的时间大约是5秒.如果现在会发生并发,则将需要1 2 3 4 5秒加上执行时间.

@Test

public void name1() throws Exception {

Observable value = Observable.just(1_000, 2_000, 3_000, 4_000, 5_000)

.flatMap(i -> Observable.fromCallable(() -> doWork(i)).subscribeOn(Schedulers.io())

).doOnNext(integer -> System.out.println("value"));

value.test().awaitTerminalEvent();

}

private int doWork(int sleepMilli) {

try {

Thread.sleep(sleepMilli);

} catch (InterruptedException e) {

e.printStackTrace();

}

return -1;

}

关于您的代码,我建议:

>将接口的匿名实现转换为私有内部类实现,并使用其实例.您将获得更具可读性的可观察性

>不要对内部运算符的全局变量使用副作用.您

如果涉及并发,将获得竞争条件.

List eventFeedItems = Arrays.asList(new FeedsListModel(), new FeedsListModel());

Observable feedsListModelObservable = Observable.fromIterable(eventFeedItems)

.flatMap(feedsListModel -> Observable.fromCallable(() -> calculation(feedsListModel))

.subscribeOn(Schedulers.computation())

);

feedsListModelObservable

.toList()

.observeOn(Schedulers.io())

.subscribe(feedsListModels -> {

// do UI stuff

});

帮助方法:

private FeedsListModel calculation(FeedsListModel model) {

// do calculation here

return new FeedsListModel();

}

标签:multithreading,rx-java,java,android

来源: https://codeday.me/bug/20191026/1937636.html

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值