将Android View#post(Runnable)转换为RxJava

时间:2017-01-12 12:59:59

标签: android android-view rx-java rx-android

使用了一点RxJava并且可以看到它的优点。一个是当onStop()中的订阅被取消订阅时,匿名内部类被垃圾收集。

对RxJava不熟悉,如果不对,请对不起。

也许是这样的:

pager.post(new Runnable() {
    public void run() {
        final int currentItem = pager.getCurrentItem(); 
        pager.setAdapter(new MyAdapter(getSupportFragmentManager()));
        pager.setCurrentItem(currentItem);
    }
});

变为:

Observable.just(pager)
    .observeOn(AndroidSchedulers.mainThread())
    .subscribeOn(AndroidSchedulers.mainThread())
    .subscribe(pager -> {
        final int currentItem = pager.getCurrentItem(); 
        pager.setAdapter(new MyAdapter(getSupportFragmentManager()));
        pager.setCurrentItem(currentItem);
    });

我问的原因是我在轮换和更新ViewPager时遇到了问题,结果是传递给post(Runnable)的匿名内部Runnable。可以节省时间,为任务创建一个WeakReference的静态内部类。

1 个答案:

答案 0 :(得分:0)

  

你什么时候做这个可运行的帖子?

简而言之:

RxJava在这种情况下并没有特别的帮助,可以使用Handler来完成。

更多详情:

两个代码段都会做同样的事情,它们最终会在主线程处理程序上发布一个runnable / action(将按照主线程中排队的其他操作的顺序进行处理)。

如果你是从另一个线程进行的,那么主线程上可能会有'race'活动完成/销毁,这意味着在你需要'live'的行动之前,将会调用使viewpager不再可用的动作viewPager对象,可以使崩溃/ null异常。

确实,如果您将使用finish / destroy操作取消订阅主线程上的observable(无论生命周期事件使viewPager不再“活动”),将不会调用该操作,并且将阻止崩溃。

可以使用Handler.removeCallbacks以类似方式完成,而不是使用Handler.post()使用View.post(内部使用处理程序)。