时,当用户旋转屏幕会重新启动。...这样,其实给我们带来一个很大的问题,DialogFragment说白了是Fragment,和当前的Activity的生命周期会发生绑定,我们旋转屏幕会造成Activity的销毁,当然也会对DialogFragment...从效果图可以看到,无论如何旋转不会重启Activity. 效果图: 6、旋转屏幕的最佳实践 下面要开始今天的难点了,就是处理文章开始时所说的,当异步任务在执行时,进行旋转,如果解决上面的问题。...传入新的Activity时,我们会在再次打开一个加载框,当然了因为屏幕的旋转并不影响加载的数据,所有后台的数据一直继续在加载。...,其实不仅是屏幕旋转需要保存数据,当用户在使用你的app时,忽然接到一个来电,长时间没有回到你的app界面也会造成Activity的销毁与重建,所以一个行为良好的App,是有必要拥有恢复数据的能力的~~
例如,一个 app 的用户可能会旋转屏幕,回复一条通知信息,或者切换到另一个任务,而用户应该能够在这类操作后继续流畅地使用这个 app。 为了提供这种用户体验,你应该知道怎么管理组件的生命周期。...activity 的应用被用户开启,结束,和重启时发生了什么: ?...场景 1:应用被终止并且重启 状态处理 onSaveInstanceState 不会被调用 (因为 activity 被结束了,你不需要保存状态) onCreate 没有 Bundle 对象,如果重新打开应用的话...---- 单一 Activity — 场景 3:配置发生变化 触发原因: 配置发生变化,例如屏幕旋转 在多窗口模式下,用户调整窗口大小 ?...场景 3:屏幕旋转或其他配置变化 状态处理 像屏幕旋转或窗口大小改变,这种配置变化应该能够让用户在变化后继续无缝使用。
DialogFragment在android 3.0时被引入。是一种特殊的Fragment,用于在Activity的内容之上展示一个模态的对话框。典型的用于:展示警告框,输入框,确认框等等。...2、 好处与用法 使用DialogFragment来管理对话框,当旋转屏幕和按下后退键时可以更好的管理其声明周期,它和Fragment有着基本一致的声明周期。...且DialogFragment也允许开发者把Dialog作为内嵌的组件进行重用,类似Fragment(可以在大屏幕和小屏幕显示出不同的效果)。...左边为模拟器,右边为我的手机~~~~~ 7、屏幕旋转 当用户输入帐号密码时,忽然旋转了一下屏幕,帐号密码不见了~~~是不是会抓狂 传统的new AlertDialog在屏幕旋转时,第一不会保存用户输入的值...可以看到,传统的Dialog旋转屏幕时就消失了,且后台log会报异常~~~使用DialogFragment则不受影响。 好了,关于DialogFragment的介绍结束~~~~ 源码点击下载
例如,一个 app 的用户可能会旋转屏幕,回复一条通知信息,或者切换到另一个任务,而用户应该能够在这类操作后继续流畅地使用这个 app。 为了提供这种用户体验,你应该知道怎么管理组件的生命周期。...例如,一个 app 的用户可能会旋转屏幕,回复一条通知信息,或者切换到另一个任务,而用户应该能够在这类操作后继续流畅地使用这个 app。 为了提供这种用户体验,你应该知道怎么管理组件的生命周期。...activity 的应用被用户开启,结束,和重启时发生了什么: 场景 1:应用被终止并且重启 状态处理 onSaveInstanceState 不会被调用 (因为 activity 被结束了,你不需要保存状态...) onCreate 没有 Bundle 对象,如果重新打开应用的话。...---- 单一 Activity — 场景 3:配置发生变化 触发原因: 配置发生变化,例如屏幕旋转 在多窗口模式下,用户调整窗口大小 场景 3:屏幕旋转或其他配置变化 状态处理 像屏幕旋转或窗口大小改变
痛点一:蹩脚地处理ViewModel和View层通信 发现问题 当屏幕可旋转后,LiveData不好用了?...updateUI() showToast(it) }) } } 这样的写法乍一看没有毛病,但没有考虑到横竖屏切换如果伴随页面销毁重建的话,会导致在当前页面每次屏幕旋转都会重新执行...LiveData会保证订阅者总能在值变化的时候观察到最新的值,并且每个初次订阅的观察者都会执行一次回调方法。...但选型时我们要考虑以下问题,也是LiveData被推荐使用的优势 : 是否会发生内存泄漏,观察者的生命周期遭到销毁后能否自我清理 是否支持线程切换,比如LiveData保证在主线程感知变化并更新UI 不会在观察者非活跃状态下消费事件...也可以使用repeatOnLifecycle(State) 来在UI层收集,当生命周期 < State时,会取消协程,恢复时再重新启动协程。
随屏幕旋转(横竖屏幕切换)DialogFragment对话框随之自动调整对话框大小。AlertDialog和PopupWindow随屏幕切换而消失,并且如果处理不当很可能引发异常。...DialogFragment的出现完美的解决了横竖屏幕切换Dialog消失的问题。...,而是在DialogFragment中的onDestroyView()回调时,才会对DialogFragment进行出栈操作,所以如果你如果需要在Activity中频繁的显示隐藏一个DialogFragment...,那么在dismiss时需要手动的调用dismissAllowingStateLoss()方法,并且再次show时不能用上一个DialogFragment实例。...DialogFragment并没有对Dialog的消失提供监听给调用者使用,但是我们通过源码分析得知,DialogFragment在onActivityCreate当中其实已经帮我们设置了onDismissListener
DialogFragmentDemos.gif 一、DialogFragment 是什么 DialogFragment 在 Android 3.0 时被引入,是一种特殊的 Fragment,用于在 Activity...基本一样的生命周期,使用 DialogFragment 来管理对话框,当旋转屏幕和按下后退键的时候可以更好的管理其生命周期 在手机配置变化导致 Activity 需要重新创建时,例如旋转屏幕,基于 DialogFragment...= null){ mCancelListener.onCancel(); } 这便是我们在构造函数中传入 OnCancelListener 的原因,当我们想要做一些取消对话框后的处理时,只要在构造函数中传入...AlertDialog 的交互,Helper 会帮助我们用 DialogFragment 来进行显示,这样既能统一整个应用的 Dialog 风格,又能让我们实现各种各样的对话框变得相当的简单 在实现...--不设置在6.0以上会出现,宽度不充满屏幕的情况--> 90% <!
关于详解Android应用中DialogFragment的基本用法,大家可以参考下。 1、 概述 DialogFragment在android 3.0时被引入。...在DialogFragment产生之前,我们创建对话框:一般采用AlertDialog和Dialog。注:官方不推荐直接使用Dialog创建对话框。...2、 好处与用法 使用DialogFragment来管理对话框,当旋转屏幕和按下后退键时可以更好的管理其声明周期,它和Fragment有着基本一致的声明周期。...且DialogFragment也允许开发者把Dialog作为内嵌的组件进行重用,类似Fragment(可以在大屏幕和小屏幕显示出不同的效果)。...解决宽度和高度问题,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。
此处就要涉及局部坐标系相对于世界坐标系的位置和方向,或者说空间中的点的位置发生变化时,坐标如何变化。 考虑三种基本的变换:平移、旋转和缩放。 OpenGL对模型进行旋转、平移和缩放。...这时可用多个变换的叠加构建矩阵: 首先将顶点(x, y, z)平移到原点,绕X轴旋转角度p使指定的旋转轴在x-z平面上,绕Y轴旋转角度q使指定的旋转轴与Z轴重合,绕指定旋转轴(也就是z轴)旋转角度θ,绕...观察者的位置和方向会变化,看上去就好像整个世界的位置和方向发生变化了一样,所以我们将世界里的所有模型看作一个大模型,在所有模型矩阵的左侧再乘以一个表示整个世界变换的模型矩阵,就可以了。...解答是这样:如果在计算机上模拟观察者喝了缩小药水的情形,在屏幕上看到整个世界是膨胀的,因为在那个虚拟的三维空间中,计算机屏幕这个「窗口」也随你(观察者)缩小。...顶点在其中的坐标,其x值和y值直接就是顶点在屏幕上的坐标,而z坐标值可以用来表示顶点深度,如果两个不同顶点投影到平面上时重合了,深度可以来确定那个点在前面。
开门见山的说,实现屏幕自动/手动旋转的方式有两种: 一种是在工程的代码中定义,这种方式在横竖屏切换时执行的操作是:销毁当前Activity–根据新的屏幕尺寸重建Activity。...不配置configChanges或配置configChanges为非以上配置时,切屏会重新调用当前Activity的各个生命周期。Activity中的数据会被销毁。...orientation 屏幕方向发生变化——用户旋转了屏幕。...我想要实现的是当打开“屏幕旋转”时,App内的Activity跟随重力感应器;当关闭“屏幕旋转”时,App内的Activity固定为默认方向。如何做到关闭重力传感器时,App亦关闭屏幕自动旋转?...当参数为user时,当“屏幕旋转”开启,则特定Activity根据根据重力传感器改变横竖屏;当“屏幕旋转”关闭,则特定Activity会固定位默认方向(一般为正面竖屏)。
2.没有内存泄漏 观察者都是绑定Lifecycle的, Lifecycle destory 的话,会销毁自己。...5.会及时更新最新的数据 简单来说,Livedata 在生命周期非活状态inactive,数据发生变化的话,变成活状态active的时候,会回调一次最终的数据。...6.适应屏幕旋转的数据保存 像屏幕旋转导致的 activity 或 fragment重创建之后,Livedata 会立即通知一下相应的观察者。保证了数据不会丢失。...setValue(T)会导致Observer使用值"John Doe"调用onChanged()方法。...当LiveData对象没有任何活跃的Observer时,onInactive()方法被调用。 由于没有Observer在监听,所以没有理由继续保持与StockManager服务的连接。
当覆盖loadView方法来创建view时,不应该call super。因为loadView应当实现所有需要绘制view的过程,而调用super会无谓的消耗cpu。...去适应屏幕旋转可以参考以下步骤来做: a) 覆盖vc的shouldAutorotateToInterfaceOrientation:方法并且生命需要支持的方向。...旋转过程解析:在基于iOS的设备旋转时,系统会send一个UIDeviceOrientationDidChangeNotification通知让每个观察者知道已经发生变化了。...旋转处理时注意的Tips: a) 在旋转过程中禁止event传递。减少意外; b) 存储可见的Map区域。...当你定义了一个storyboard时,iOS会自动做一些工作帮助你去构建app。
因此,我们认为LiveData就是一个数据容器,它负责将数据包裹起来,使数据成为被观察者,当数据发生变化时,LiveData会通知观察者以便观察者做出响应。...当配置发生更改(如屏幕旋转)而重建 Activity / Fragment,它会立即收到最新的可用数据。 资源共享。...observe() 后,系统会立即调用 onChanged(),从而提供 mCurrentName 中存储的最新值,如果 LiveData 对象尚未在 mCurrentName 中设置值,则不会调用...此时,LiveData会认为订阅者的生命周期处于STARTED或RESUMED状态时,该订阅者是活跃的,那么如何使用 StockLiveData 类呢,如下所示。...,会调用onStateChanged方法,当组件处于DESTROYED状态时,会调用removeObserver方法移除observer。
1、数据倒灌的出现 场景: 如果我们在一个home页面获取网络数据,然后通过LiveData的观察者特性,在回调中跳转B页面,当旋转屏幕时,页面重建,LiveData又发来最后一次数据,那么直接触发了跳转...因为LiveData的数据会保存在内存中。 数据倒灌原因: 个人描述:我们都知道LiveData是一个观察者模式,被观察者只要改变了观察者会收到通知。...但是屏幕旋转后,mLastVersion的值却变成了-1。这里就是问题所在了。...由于LiveData本身的特性,Activity的生命周期由非活跃变成活跃时,LiveData会触发事件分发,导致屏幕旋转或者切换系统语言后出现数据倒灌。...解决办法 再来回顾下,数据倒灌的常见方式: 屏幕旋转 用户手动切换系统语言 方案: 如果应用不需要横屏,就设置为永久竖屏。
分享给大家供大家参考,具体如下: 背景 Android 官方推荐使用 DialogFragment 来代替 Dialog ,可以让它具有更高的可复用性(降低耦合)和更好的便利性(很好的处理屏幕翻转的情况..., R.style.CustomDialog); } 处理屏幕翻转 如果使用传统的 Dialog ,需要我们手动处理屏幕翻转的情况,但使用 DialogFragment 的话,则不需要我们进行任何处理,...FragmentManager 会自动管理 DialogFragment 的生命周期。...null); Dialog dialog = new Dialog(getActivity(), R.style.CustomDialog); // 关闭标题栏,setContentView() 之前调用...方法 ① 在使用了多线程(例如网络请求)的情况下,不能正确的获取当前 Fragment 的状态,会产生空指针异常。
https://blog.csdn.net/gdutxiaoxu/article/details/62235974 讲解之前需要说明的是 旋转屏幕:在系统的自动旋转屏幕开启的情况下,我们旋转屏幕...官网地址: 值 描述 keyboardHidden 键盘的可访问性发生变化——例如:用户发现了硬件键盘。 orientation 屏幕方向发生变化——用户旋转了屏幕。...screenLayout 屏幕布局发生变化——这个会导致显示不同的Activity。屏幕方向发生变化——用户旋转了屏幕。...如果我们打开系统的自动旋转屏幕,旋转屏幕,系统不会发生变化,也不会调用 Activity 的 onConfigurationChanged 方法。...至于选择在onPause() 还是 onStop() 保存数据,得看具体的需求分析。 onPause() 在界面失去焦点的时候会回调, onStop() 方法在界面完全不可见的时候会回调。
(很好的处理屏幕翻转的情况)。..., R.style.CustomDialog); } 处理屏幕翻转 如果使用传统的 Dialog ,需要我们手动处理屏幕翻转的情况,但使用 DialogFragment 的话,则不需要我们进行任何处理,...FragmentManager 会自动管理 DialogFragment 的生命周期。...扩展阅读:Dialog 在屏幕翻转时的处理 无标题栏/全屏 在基本用法里代码注释有设置主题的地方,下面详细说下两种方法下设置无标题栏和实现全屏的方式: 无标题栏 对于方法 ① : @Override public...(例如网络请求)的情况下,不能正确的获取当前 Fragment 的状态,会产生空指针异常。
△ 传统的请求数据与单向数据流 响应式编程 我们将这类观察者会自动对被观察者对象的变化而作出反应的系统称之为响应式编程,它的另一个设计要点是保持数据只在一个方向上流动,因为这样更容易管理且不易出错。...,此时 Activity 会收到 onStop 信号;当重新打开应用时又会调用 onStart。...如果您调用 repeatOnLifecycle 并传入 STARTED 状态,界面就只会在屏幕上显示时收集数据流发出的信号,并且在应用转到后台时取消收集。...△ 旋转屏幕会重建 Activity 但能够保留 ViewModel 以如下代码中的冷流为例,由于每次收集冷流时它都会重启,所以在设备旋转之后会再次调用 repository.fetchItem()。...当设置了超时时间后,如果按下主屏幕按钮会让视图立即结束收集,但 StateFlow 会经过我们设置的超时时间之后才会停止其上游数据流,如果用户再次打开应用则会自动重启上游数据流。
例如:Activity在配置发生改变时(屏幕旋转),Activity就会重新创建,onCreate()方法也会重新调用。...直到当前Activity被系统销毁时,Framework会调用ViewModel的onCleared()方法,我们可以在onCleared()方法中做一些资源清理操作。...观察者可以在每次应用程序数据更改时更新UI,而不是每次发生更改时更新UI。 没有内存泄漏 当观察者被绑定他们对应的LifeCycle以后,当页面销毁时他们会自动被移除,不会导致内存溢出。...配置的改变 当前Activity配置改变(如屏幕方向),导致重新从onCreate走一遍,这时观察者们会立刻收到配置变化前的最新数据。...* 这时候如果acitivty的ConfigrationChange调用的话,由于activity对象并没有被重建,还是之前的对象,那么我们所取到的ViewModel也不会发生变化 */ /**
实时数据刷新 当组件处于活跃状态或者从不活跃状态到活跃状态时总是能收到最新的数据 解决Configuration Change问题 在屏幕发生旋转或者被回收再次启动,立刻就能收到最新的数据。...目前在组件的onCreate()方法中开始观察数据,代码如下所示: 思考下,可以在onResume()中调用么,个人觉得不太好。因为系统会多次调用onResume()方法。...对于onActive方法,当活动观察者的数量从0变为1时调用;对于onInactive方法,当活动观察者的数量从1变为0时调用if (wasInactive && mActive) { onActive...dispatchingValue除了在我们主动更新数据的时候会触发, 当LifeCircleOwner的状态发生变化的时候,会调用LiveData.ObserverWrapper的activeStateChanged...在联动生命周期时,会自动在 DESTROYED 的状态下移除 Observer ,取消订阅,所以不用担心内存泄露; LiveData的观察者只能与一个LifecycleOwner绑定, 否则会抛出异常。
领取专属 10元无门槛券
手把手带您无忧上云