背景:
我有一个主要的Activity
,它包裹了一个Fragment
可以改变的主要部分,并且为了保持一个后备箱,我使用FragmentManager
的是后备箱.
保持活动堆栈的主要区别在于,当一个片段被推到后台并被替换时,它会调用它onDestroyView()
而不是它onDestroy()
,当它返回时它的视图将被重新创建onCreateView()
.(onCreate()
但未调用碎片对象未被调用)
在活动堆栈中,它不会发生,并且视图仍然存在.
这对低端设备有积极影响,因为Android操作系统可以释放一些内存而你不必保持正确的视图(在我的应用程序中,来自服务器的消息可能随时改变视图),这样可以节省宝贵的内存带宽也是如此.
实际问题:
假设我有一个片段,用户点击某些内容并更改了视图,例如扩展了列表.
如果用户然后转到另一个屏幕(即片段),则前一个片段将被推送到后台,并且它的视图将被销毁.
当用户返回时,片段将被重新创建,并且不会"记住"用户所做的更改,例如列表不会被扩展,因为它应该
那么如何在不为每个视图制作特殊情况的情况下保存状态并恢复它?
不受欢迎的答案:
onSaveInstanceState()
:当片段被推送到后台时,它不会被调用,因为活动没有被破坏而且不是配置改变.android savestate android-fragments back-stack fragmentmanager
我亲眼目睹了onBackpressureBuffer的奇怪行为,我不确定它是一个有效的行为还是一个bug.
我有一个tcp调用,以一定的速率发出项目(使用流和inputStream,但只是为了一些信息)
最重要的是,我创建了一个使用create的observable,每次准备就会发出一个项目.
我们称之为message().
然后我这样做:
messages()
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe({//do some work});
Run Code Online (Sandbox Code Playgroud)
我注意到使用很少抛出MissingBackPressureException的分析工具,所以我在调用中添加了onBackpressureBuffer.
如果我在之后添加observeOn
:
messages()
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.onBackpressureBuffer()
.subscribe({//do some work})
Run Code Online (Sandbox Code Playgroud)
Everyting工作得很好,但这意味着只有在获得UI主线程之后它才会缓冲,所以我更喜欢它是这样的:
messages()
.onBackpressureBuffer()
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe({//do some work});
Run Code Online (Sandbox Code Playgroud)
事情开始变得奇怪.
我注意到while messages()
会继续发出项目,但在某些时候它们将停止发送给订阅者.
更准确地说,正好在16个项目之后,显而易见的是缓冲区将开始持有物品而不会将它们向前传递.
一旦我取消了messages()
某种超时机制,它将导致messages()
发出onError()
,缓冲区将立即发出它保存的所有项目(它们将被处理).
我已经检查过是否是订购太多工作的订户错误但是没有,他已经完成但他仍然没有得到这些物品......
我也尝试request(n)
在订阅者中使用该方法,在onNext()
完成后请求一个项目,但缓冲区不起作用.
我怀疑Main Android UI Thread的消息系统带有背压导致这个,但我无法解释原因.
谁能解释为什么会这样?这是一个错误还是一个有效的行为?TNX!