时,当用户旋转屏幕会重新启动。...注:这里也没有考虑加载时旋转屏幕,问题与上面的一致。...从效果图可以看到,无论如何旋转不会重启Activity. 效果图: 6、旋转屏幕的最佳实践 下面要开始今天的难点了,就是处理文章开始时所说的,当异步任务在执行时,进行旋转,如果解决上面的问题。...下面我们希望有一种解决方案:在加载数据时旋转屏幕,不会对加载任务进行中断,且对用户而言,等待框在加载完成之前都正常显示: 当然我们还使用Fragment进行数据保存,毕竟这是官方推荐的: OtherRetainedFragment...传入新的Activity时,我们会在再次打开一个加载框,当然了因为屏幕的旋转并不影响加载的数据,所有后台的数据一直继续在加载。
表 A 上有一个语句级触发器,其内容为在触发时执行 alter sequence 操作;另外还有一个 insert 时的行级触发器,其内容为将每行的部分列赋给新值,这些新值要么来自 sequence.nextval...问题影响的版本22.2.14.100 及以前的所有版本23.2.1.100 及以前的所有版本问题发生原因yashandb 的代码 bug,批量执行循环调用 anlExecuteSingle,会多次触发语句级触发器解决方法及规避方式版本层面通过修改代码解决...规避方式不使用语句级触发器问题分析和处理过程使用如下的 ddl 来验证语句级触发器被触发了多少次:drop table trig_test;create table trig_test(t1 number...conn.commit(); }catch (Exception e){ e.printStackTrace(); }}java 代码执行完成后,查看 flag 表中的总数据量,就可以知道触发器被触发了多少次...yashandb 的实际结果:可以看到,语句级触发器被触发了 100 次,这是不合理的。经验总结了解客户对 jdbc 的使用场景;灵活使用辅助表来验证触发器的触发次数。
熟悉Fragment的开发人员都知道,Fragment是依附于Activity的。当Activity销毁时,Fragment会随之销毁。...而当Activity配置发生改变(如屏幕旋转)时候,旧的Activity会被销毁,然后重新生成一个新屏幕旋转状态下的Activity,自然而然的Fragment也会随之销毁后重新生成,而新生成的Fragment...生命周期 Activity的生命周期在配置发生改变时: onPuase->onStop->onDestroy->onStart->onResume 比如在Activity中发生屏幕旋转,其生命周期就是如此...和onActivityCreated还是会被调用。...需要注意的是,要使用这种操作的Fragment不能加入backstack后退栈中。并且,被保存的Fragment实例不会保持太久,若长时间没有容器承载它,也会被系统回收掉的。
有了一个人脸检测的SDK,能够得到相机预览时每帧人脸在屏幕中的坐标及旋转角度。...这是刚接触Shader时很容易会产生的疑惑之一,实际上,Shader代码会被OpenGL反复调用多次,每画一个点就会调用一次,a_Position就代表当前要画的点,反复不停地调用,a_Position...这里有一点需要注意的是,假设涂鸦画布的实际尺寸是600*600,它随人脸进行缩放后,它的实际尺寸仍然是600*600,只不过显示的时候被缩放了,因此在将触摸点转换成涂鸦画布上的对应点时,仍要按涂鸦画布是...之前说过,涂鸦画布在实际使用的时候,会设置成比屏幕大一些,以确保在人脸缩小后,画布不至于被跟着缩小至比屏幕还小,不然有些地方就涂不上去了,将涂鸦画布设大,可以把它的实际尺寸设大,也可以是把它进行显示放大...现在可以将手指在屏幕上触摸时在onTouchEvent()回调中所得到的触摸坐标正确地转换成涂鸦画布中的坐标了,那么如何在对应的坐标点画涂鸦图案呢?
DialogFragment在android 3.0时被引入。是一种特殊的Fragment,用于在Activity的内容之上展示一个模态的对话框。典型的用于:展示警告框,输入框,确认框等等。...2、 好处与用法 使用DialogFragment来管理对话框,当旋转屏幕和按下后退键时可以更好的管理其声明周期,它和Fragment有着基本一致的声明周期。...且DialogFragment也允许开发者把Dialog作为内嵌的组件进行重用,类似Fragment(可以在大屏幕和小屏幕显示出不同的效果)。...左边为模拟器,右边为我的手机~~~~~ 7、屏幕旋转 当用户输入帐号密码时,忽然旋转了一下屏幕,帐号密码不见了~~~是不是会抓狂 传统的new AlertDialog在屏幕旋转时,第一不会保存用户输入的值...可以看到,传统的Dialog旋转屏幕时就消失了,且后台log会报异常~~~使用DialogFragment则不受影响。 好了,关于DialogFragment的介绍结束~~~~ 源码点击下载
Activity 的生命周期由一系列回调方法组成,这些方法在 Activity 的不同状态时被系统调用。...系统由于资源不足而销毁 Activity(例如内存不足时)。8. onSaveInstanceState()**作用**: 在 Activity 可能被系统销毁之前调用,用于保存临时状态数据。...这些数据可以在 onCreate() 或 onRestoreInstanceState() 中恢复。**调用时机**: Activity 可能被系统销毁时调用(例如屏幕旋转或内存不足时)。...**调用时机**: Activity 重新创建时调用(例如屏幕旋转后)。...**配置更改**: 当设备配置发生改变(如屏幕旋转)时,默认情况下 Activity 会被销毁并重新创建,此时 onDestroy() 会被调用。
被销毁了还是屏幕旋转导致configuration发生了变化,保存在其中的数据依然存在。...基本使用 3.1 数据存储 我们参考官方Demo实现一个计时器的功能,并且演示当屏幕发生旋转时,计时器会不会重新启动: DemoViewModel class DemoViewModel : ViewModel...,当我们旋转屏幕的时候你会发现,计时器的值并没有变化,仍然按照旋转之前的数值进行计数。...也就是上面提到的FragmentViewModel.java里面的clearNonConfigState()方法,而这个方法只在一个地方被调用了: if (DEBUG) Log.v(TAG, "movefrom...; } 这个方法是在FragmentManagerImpl.java中的moveToState方法里面的,这个方法是跟随着Fragment的生命周期的,当这个方法被调用时,判断两个状态beingRemoved
1.1 出场背景 在详细介绍ViewModel前,先来看下背景和问题点。 Activity可能会在某些场景(例如屏幕旋转)销毁和重新创建界面,那么存储在其中的界面相关数据都会丢失。...看到在因屏幕旋转而重新创建Activity后,ViewModel对象依然会保留。只有Activity真正Finish的时ViewModel才会被清除。...所以屏幕旋转等的配置改变 不会影响到这个实例?继续看这个猜想是否正确。...4.1 使用场景 在我很久之前一篇文章《Activity生命周期》中有提到: onSaveInstanceState调用时机: 当某个activity变得“容易”被系统销毁时,该activity的onSaveInstanceState...3、按下电源按键(关闭屏幕显示)时。 4、从activity A中启动一个新的activity时。 5、屏幕方向切换时,例如从竖屏切换到横屏时。
Fragment 的重建, 会导致框架对 Fragment 的自定义适配参数失去效果 //所以如果您的 Fragment 允许屏幕旋转, 则请在 onCreateView 手动调用一次...AutoSize.autoConvertDensity() //如果您的 Fragment 不允许屏幕旋转, 则可以将下面调用 AutoSize.autoConvertDensity(...Fragment 的重建, 会导致框架对 Fragment 的自定义适配参数失去效果 //所以如果您的 Fragment 允许屏幕旋转, 则请在 onCreateView 手动调用一次...AutoSize.autoConvertDensity() //如果您的 Fragment 不允许屏幕旋转, 则可以将下面调用 AutoSize.autoConvertDensity(...Fragment 的重建, 会导致框架对 Fragment 的自定义适配参数失去效果 //所以如果您的 Fragment 允许屏幕旋转, 则请在 onCreateView 手动调用一次
为什么在旋转屏幕后不会丢失状态? 为什么ViewModel可以跟随Activity/Fragment的生命周期而又不会造成内存泄漏呢? ViewModelScope了解吗?...为什么在旋转屏幕后不会丢失状态?为什么ViewModel可以跟随Activity/Fragment的生命周期而又不会造成内存泄漏呢?...而且设置setRetainInstance(true)方法可以保证configchange时的生命周期不被改变,让这个Fragment在Activity重建时存活下来。...} } } }); 这里的onRetainNonConfigurationInstance方法再说下,是会在Activity因为配置改变而被销毁时被调用...它能在ViewModel销毁时 (onCleared() 方法调用时) 退出。
组件可以是一个 Activity,一个 Fragment,一个 Service,或者 Application 本身,甚至是在默默运行的进程。组件有生命周期,生命周期会在多种状态中变换。...activity 的应用被用户开启,结束,和重启时发生了什么: ?...---- 单一 Activity — 场景 3:配置发生变化 触发原因: 配置发生变化,例如屏幕旋转 在多窗口模式下,用户调整窗口大小 ?...场景 3:屏幕旋转或其他配置变化 状态处理 像屏幕旋转或窗口大小改变,这种配置变化应该能够让用户在变化后继续无缝使用。...调用意图选择器,例如调用了分享对话框 ? 场景 4:应用被系统暂停 这个场景不适用于以下情况: 对话框属于同一个应用。
在应用开发中,通常将UI交互、数据获取等业务逻辑全部写在页面中,当项目需求不断增加,页面功能复杂时,页面类会显得尤为臃肿,且不宜维护。...ViewModel与onSaveInstanceState() 通常我们使用onSaveInstanceState()来解决屏幕旋转带来的数据丢失问题,但是它只能保存少量的支持序列化的数据,Viewmodel...该方法就会被调用,在方法里可以执行一些资源释放相关的工作,注意屏幕旋转导致的Activity重建不会调用该方法。...Activity重建时,数据不会消失,代表ViewModel并没有被销毁,持有的数据一直存在。...当切换Fragment时,会提示计数器当前值,达到了Fragment之间的通信。
ViewModel 对配置的重新加载(比如屏幕旋转)具有“抗性” ↑ 把视图层(Activity 或 Fragment)的引用传递给 ViewModel 是有 相当大的风险 的。...这样有几个好处: ViewModel 在配置重新加载(比如屏幕旋转)的时候是不会变化的,所以没有必要从外部(比如网络和数据库)重新获取数据。...旋转屏幕是最明显的情况,我们已经在 ViewModel 部分提到了。保存在 ViewModel 的状态是安全的。 但是,你可能需要在其他 ViewModel 也消失的场景中恢复状态。...但是,如果用户旋转手机,则新的 Activity 被创建并开始观察这个字段。当对 LiveData 的观察开始时,Activity 会立即收到已经使用过的值,这将导致消息再次显示!...该函数被调用并且结果被分发到下游。
组件可以是一个 Activity,一个 Fragment,一个 Service,或者 Application 本身,甚至是在默默运行的进程。组件有生命周期,生命周期会在多种状态中变换。...activity 的应用被用户开启,结束,和重启时发生了什么: 场景 1:应用被终止并且重启 状态处理 onSaveInstanceState 不会被调用 (因为 activity 被结束了,你不需要保存状态...假设应用的进程没有被终止,这个应用的实例会常驻在内存,保存所有状态。当这个 activity 回到前台工作时,它会恢复这些状态。你不需要重新初始化这些之前已生成的组件。...---- 单一 Activity — 场景 3:配置发生变化 触发原因: 配置发生变化,例如屏幕旋转 在多窗口模式下,用户调整窗口大小 场景 3:屏幕旋转或其他配置变化 状态处理 像屏幕旋转或窗口大小改变...调用意图选择器,例如调用了分享对话框 场景 4:应用被系统暂停 这个场景不适用于以下情况: 对话框属于同一个应用。
它的生命周期与调用它的组件相关联,通常是函数组件。当组件被重新创建时,remember 中存储的数据会丢失。...数据持久性: ViewModel: ViewModel 中的数据通常具有较长的生命周期,并且在配置更改(如屏幕旋转)时会被保留。...这意味着在 activity 之间导航时或进行配置更改后(例如旋转屏幕时),界面将无需重新提取数据。...SideEffect 中的回调函数只在 MyList 组件第一次创建时被调用,因为 SideEffect 会在组件创建时运行其代码块,并在每次组件重新组合时运行。...要使 SideEffect 在列表数据改变时被调用,可以考虑将列表数据作为 key 参数传递给 MyList 组件,这样当列表数据改变时,MyList 组件将会重新创建,触发 SideEffect 的回调函数
ViewModel 被设计用来以与生命周期相关的方式保存和管理 UI 相关的数据。ViewModel 允许数据在例如屏幕旋转这样的配置更改后依然保留。...ViewModel 被设计用来以与生命周期相关的方式保存和管理 UI 相关的数据。ViewModel 允许数据在例如屏幕旋转这样的配置更改后依然保留。...() 被调用的时候调用。...onSaveInstanceState() 在配置更改期间和 activity 进入后台时被调用;在这两种情况下,如果你的数据被保存在 ViewModel 中,实际上并不需要重新加载或者处理他们。...此外,Loader 可以在配置更改期间保留,比如说在加载的过程中你旋转了手机屏幕。这听起来很耳熟吧!
例如,在 Activity 或 Fragment 被销毁时,协程会被取消。...例如,在 Activity 或 Fragment 被销毁时,协程会被取消。...例如,在 Activity 或 Fragment 被销毁时,协程会被取消。...当 Activity 或 Fragment 被销毁时,所有在 LifecycleScope 中启动的协程都会自动取消。...当 Activity 被销毁(例如屏幕旋转或用户离开),生命周期会先降到 STARTED(如果用户稍后返回该活动),继而完全销毁,这时协程会自动取消,不会保留对 Activity 的引用,从而避免内存泄漏
方式添加,在由于内存紧张导致Fragment被系统杀掉并恢复(re-instantiate)时能保留这些数据。...onCreate():Fragment被创建时调用。 onCreateView():创建Fragment的布局。...onDetach():当Fragment和Activity解除关联时调用。 上面的方法中,只有onCreateView()在重写时不用写super方法,其他都需要。...可以看到,F1被替换时,最后只调到了onDestroyView(),并没有调用onDestroy()和onDetach()。...他的优点是:即使旋转屏幕,也能保留对话框状态。 如果要自定义对话框样式,只需要继承DialogFragment,并重写onCreateView(),该方法返回对话框UI。
由于Log太长,一屏根本截不完,反正就是很多个Fragment经历了onCreate->onDestory的所有过程; 操作前,只有Fragment2创建并显示,理论上旋转屏幕之后,只有Fragment2...销毁并重建,不会调用其他Fragment;现在问题发生在了,旋转之后有一堆Fragment创建并且销毁,最终保留的也只有Fragment2,这肯定是个Bug,虽然发生在一行代码都没有改的官方Demo上;...在竖屏时,widthMeasureMode一直都是1073741824(MATCH_PARENT),但是横屏状态下,widthMeasureMode在0(UNSPECIFIED)和MATCH_PARENT...FrameLayout会测量所有可见View的尺寸,然后算出最大的尺寸maxWidth和maxHeight,自身尺寸的测量调用setMeasuredDimension()方法,每个Dimension的设置调用...,横向滑动时要避免layout_width="0dp"和layout_weight="1",纵向滑动时要避免layout_height="0dp"和layout_weight="1",代码的解决方案很简单
ViewModel 被设计用来以与生命周期相关的方式保存和管理 UI 相关的数据。ViewModel 允许数据在例如屏幕旋转这样的配置更改后依然保留。...() 被调用的时候调用。...onSaveInstanceState() 在配置更改期间和 activity 进入后台时被调用;在这两种情况下,如果你的数据被保存在 ViewModel 中,实际上并不需要重新加载或者处理他们。...此外,Loader 可以在配置更改期间保留,比如说在加载的过程中你旋转了手机屏幕。这听起来很耳熟吧!...在这个场景下,ViewModel 在 activity 旋转或者进入后台时仍保留数据,而单纯用 onSaveInstanceState() 并没那么容易实现。
领取专属 10元无门槛券
手把手带您无忧上云