qingmei2 / MVVM-Architecture

The practice of MVVM + Jetpack architecture in Android.
1.83k stars 282 forks source link

关于takeUntil(mAutoDisposeObserver)导致请求无法下发的问题 #23

Closed windows7lake closed 5 years ago

windows7lake commented 5 years ago

大神,我在你的demo的基础上将HomeFragment单独提出到另一个JumpActivity时,发现一个问题: 第一次启动JumpActivity时,HomeFragment中的刷新操作是可以正常下发的,此时关闭JumpActivity,然后再次进入,会出现HomeFragment刷新事件无法下发的情况,被takeUntil(mAutoDisposeObserver)拦截了。 按照我的思路,正常关闭的时候,HomeViewModel和HomeRepository会跟随Fragment和Activity的生命周期被销毁,但是这里貌似并没有。

fun refreshPagedList() {
    fetchEventByPage(1)
                .takeUntil(mAutoDisposeObserver)
                .subscribe { mRemoteRequestStateProcessor.onNext(it) }
}

mAutoDisposeObserver在ViewModel中调用了下面代码后:

    override fun onCleared() {
        super.onCleared()

        repo.mAutoDisposeObserver.onNext(Unit)
        repo.mAutoDisposeObserver.onComplete()
    }

mAutoDisposeObserver貌似并没有重新创建,导致请求被截断。

JumpActivity代码:

class JumpActivity : BaseActivity() {
    val fragment: BaseFragment = HomeFragment()

    override val layoutId = R.layout.activity_common_fg

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        supportFragmentManager.apply {
            findFragmentByTag(fragment::class.simpleName) ?: beginTransaction()
                    .add(R.id.flContainer, fragment, fragment::class.simpleName)
                    .commitAllowingStateLoss()
        }
    }
}

activity_common_fg.xml代码:

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/flContainer"
    android:layout_width="match_parent"
    android:layout_height="match_parent" />

求教?新手上路

qingmei2 commented 5 years ago

@windows7lake

对不起,这个是我代码的问题,具体原因你可以参考这里

image

因为最近在忙,所以这个bug我只在 MVI 架构的demo上进行了修复,不知道你是否有兴趣提PR呢? 😄

windows7lake commented 5 years ago

谢谢大神!我先看看

qingmei2 commented 5 years ago

@windows7lake

谢谢你的PR. 👍