liangjingkanji / BRV

[使用文档] Android 快速构建 RecyclerView, 比 BRVAH 更简单强大
http://liangjingkanji.github.io/BRV/
MIT License
2.48k stars 317 forks source link

PageRefreshLayout在refreshing后,失效无法回调和动画无法回弹问题 #439

Open ChawLoo opened 2 months ago

ChawLoo commented 2 months ago

问题描述

下拉刷新组件失效

期望结果

正常刷新

如何复现

希望快速解决请Fork仓库复现问题并附上链接, 否则只能等有空才能排查 凭空猜测只会让问题晦涩难懂, 浪费本项目可持续维护时间

Fork:https://github.com/ChawLoo/BRV 已复现,启动即TestAct

截图

下拉组件失效了,整个APP并未卡住,下拉回调已经没了,动画效果也不回弹了 image

版本

ChawLoo commented 2 months ago

跟这个问题的根源一致 #353 也是自定义View的attachToWindow的时序问题 因为没有attachToWindow,这个判断逻辑进不去,就无法更改状态为:RefreshFinish,导致后续状态判断出现问题 image 根源是这个,然后后续一系列的状态切换问题我就不截图了,打断点能看出来

zkzk7749 commented 2 months ago

我也遇见类似问题,只是我不会排查、定位故障

ChawLoo commented 1 month ago

定位到了,正在研究如何修复

ChawLoo commented 1 month ago

有个解决方案:

post {
    if (hasMore) finishRefresh(success) else finishRefreshWithNoMoreData()
}

image

liangjingkanji commented 1 month ago

440 这个方案不行吗?

ChawLoo commented 1 month ago

440 这个方案不行吗?

不行,我已经关闭了,那个方案就无法autorefresh了,还是在SM的状态管理上的问题

ChawLoo commented 1 month ago

有个解决方案:

post {
    if (hasMore) finishRefresh(success) else finishRefreshWithNoMoreData()
}

image

如果是这个方案,考虑的地方就很多,感觉还是需要在sm的状态上做文章

liangjingkanji commented 1 month ago

你使用refreshing的生命周期是什么?

建议在ViewCreated中使用

ChawLoo commented 1 month ago

你使用refreshing的生命周期是什么?

建议在ViewCreated中使用

如果是Act呢?

liangjingkanji commented 1 month ago

Act也有类似View创建好的生命周期吧

ChawLoo commented 1 month ago

自定义View的attachToWindow生命周期是这样的, Act.onCreate -> Act.onResume -> Act.onAttachedToWindow -> View.onAttachedToWindow 所以我说加一个post能解决,但是如果加了post的话,考虑的地方就很多

ChawLoo commented 1 month ago

@liangjingkanji 最新的PR #442 我测了一下可以修复,你那边要么从其他角度看看?我自己尝试了我能想到的finish均无问题

ChawLoo commented 1 month ago

不行,如果加延迟异步执行,解决问题,但是存在一个细节,如果进入页面快速去进行下拉操作是无法下拉的

RokingYang commented 6 days ago

调用refresh后再16ms内调用finish必现。

ChawLoo commented 6 days ago

调用refresh后再16ms内调用finish必现。

他就是因为异步的原因,导致状态不一致,因为SM没有refreshing的方法,所以没问题,看大佬最近忙,自己临时方案解决一下吧,等他后续看看能不能修复