【问题标题】:Convert Android View#post(Runnable) to RxJava将 Android View#post(Runnable) 转换为 RxJava
【发布时间】:2017-01-12 12:59:58
【问题描述】:

使用了一点 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 时遇到了一个问题,结果是匿名内部 Runnable 传递给了 post(Runnable)。为该任务创建一个带有WeakReference 的静态内部类可以节省时间。

【问题讨论】:

  • 您最初遇到的具体问题是什么? Reactive 带来了相当多的复杂性及其好处,所以如果你真的需要它,首先考虑一下是明智的。
  • 我正在刷新 ViewPager 但可能会在 Activity 被销毁时发生刷新并且会像这样 code.google.com/p/android/issues/detail?id=218912

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


【解决方案1】:

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

简而言之:

RxJava 在这种情况下并不是特别有用,它可以通过 Handler 来完成。

更多详情:

两个代码段将做几乎相同的事情,它们最终将在主线程处理程序上发布一个可运行/操作(将与在主线程中排队的其他操作按顺序进行处理)。

如果您从不同的线程执行此操作,则在主线程上可能会出现活动完成/销毁的“竞赛”,这意味着将在您需要“活动”的操作之前调用将使 viewpager 不再可用的操作viewPager 对象,这可能会导致崩溃/空异常。

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多