Android MVP - 在无头片段中保留演示者时如何确保视图在配置更改期间得到更新?
Android MVP - when retaining presenter in headless fragment how to ensure view gets update during config change?
网上有很多关于将演示者包装到无头片段并将 onretaininstance 设置为 true 的内容。这可以防止片段被破坏。但是假设演示者正在进行网络下载并且发生了配置更改。 activity 即将被重新创建,但在 onCreate 调用的中间,演示者获取信息并且没有视图可以传递给 onCreate 未完成(或尚未开始)。所以演示者有这个数据,它想用它来更新视图,但还没有视图。这是一个时间问题。
如何解决这样的时序问题?
都是关于在presenter中维护数据的。确保您保留了演示者的实例并更新了对演示者的片段引用。
如果您已经在演示者中有数据,只需在片段的简历上更新它,否则演示者会回电。
TL;博士
Always start long term operations from a service. (or a JobScheduler
)
描述
如果您正在下载相当大的文件,请使用演示器触发 IntentService
(or JobScheduler
for Android Marshmallow and later), never AsyncTask
, Thread
或任何会回调到主线程的异步结构。
presenter 存活到 onPause
,但不会存活到 onDestroy
,因此如果应用程序被操作系统终止,对 activity/fragment 的引用无论如何都会丢失。
如果您是运行服务中的下载,您的演示者可以检查文件是否已经存在并正确更新activity/fragment。
记住被销毁的片段其实对OS是有好处的,所以使用early/often网络数据持久化:-)
网上有很多关于将演示者包装到无头片段并将 onretaininstance 设置为 true 的内容。这可以防止片段被破坏。但是假设演示者正在进行网络下载并且发生了配置更改。 activity 即将被重新创建,但在 onCreate 调用的中间,演示者获取信息并且没有视图可以传递给 onCreate 未完成(或尚未开始)。所以演示者有这个数据,它想用它来更新视图,但还没有视图。这是一个时间问题。
如何解决这样的时序问题?
都是关于在presenter中维护数据的。确保您保留了演示者的实例并更新了对演示者的片段引用。
如果您已经在演示者中有数据,只需在片段的简历上更新它,否则演示者会回电。
TL;博士
Always start long term operations from a service. (or a JobScheduler
)
描述
如果您正在下载相当大的文件,请使用演示器触发 IntentService
(or JobScheduler
for Android Marshmallow and later), never AsyncTask
, Thread
或任何会回调到主线程的异步结构。
presenter 存活到 onPause
,但不会存活到 onDestroy
,因此如果应用程序被操作系统终止,对 activity/fragment 的引用无论如何都会丢失。
如果您是运行服务中的下载,您的演示者可以检查文件是否已经存在并正确更新activity/fragment。
记住被销毁的片段其实对OS是有好处的,所以使用early/often网络数据持久化:-)