首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Navigation深入浅出,到出神入化,再到实战改造(二)

} 无论走哪个分支,必然调用mNavController.setGraph()方法: 在这里暂停,下面跟随代码深入,会越来越深,但思路清晰,暂且在这里设置个锚点1,会说回到锚点1 就是setGraph(...抛出异常。找到id对应的节点,找不到抛出异常。...此时设置的首页节点可能是avigator.navigate()然后继续开始导航 总结: 如果没配置startId。...抛出异常 找不到对应的NavDestination,抛出异常 上面就是启动首页第一个页面的导航路由过程,下面路由分到中 ActivityNavigator...抛出异常,找不到对应的NavDestination,抛出异常 Navigation 优缺点 优点: 支持Activity,Fragment,Dialog跳转 safesArgs安全数据传输 允许自定义导航行为

1.9K40

安卓Navigation系列——进阶篇

就是通过app:navGraph指定的导航资源文件,那么mGraphId此时不等于0,走到if语句中, @CallSuper public void setGraph(@NavigationRes int...那么我们是不能在布局文件中通过app:navGraph属性指定自定义的导航资源文件了,只能在布局文件中去掉app:navGraph这个属性,然后在添加FixFragmentNavigator的同时,通过代码将导航资源文件设置进去...FixFragmentNavigator navController.navigatorProvider.addNavigator(fragmentNavigator) //通过代码将导航资源文件设置进去...首先需要一个承载页面的容器NavHost,这个容器有个默认的实现NavHostFragment NavHostFragment有个mNavController成员变量,它是一个NavController对象,最终页面导航都是通过调用它的...setGraph()方法,传入导航资源文件,并进行解析,获取导航资源文件中的节点,得到NavDestination FragmentNavigator的navigate方法中,是通过replace方法达到

2.9K30
您找到你想要的搜索结果了吗?
是的
没有找到

Android 面试题:为什么 Activity 都重建了 ViewModel 还存在?—— Jetpack 系列(3)

新一代视图绑定方案[5] 7、Fragment:模块化的微型 Activity[6] 8、RecyclerView:可复用型列表视图 9、Navigation:单 Activity 多 Fragment 的导航方案...= mViewModelStore; // 这一个 if 语句是处理异常边界情况: // 如果重建的 Activity 没有调用 getViewModelStore(),那么旧的 Activity...nci.viewModelStore = viewModelStore; return nci; } ActivityThread.java // Framework 调用 retainNonConfigurationInstances...Activity#finish() 或返回键等间接方式; 第 2 种: 异常退出 Activity,例如内存不足; 第 3 种: 强制退出应用。...(id) 将被调用,并将结果设置到 userLiveData 上 public void setUserId(String userId) { this.userIdLiveData.setValue

1.1K20

由浅入深,详解ViewModel的那些事

何谓异常重建? 异常重建指的是非配置变更情况下导致的 Activity 重新创建。...SavedStateHandle使用方式 我们知道,ViewModel 可以处理因为配置更改而导致的的状态丢失,但并不保证异常终止的情况,而官方的 SavedStateHandle 正是用于这种情况的解决方式...从而我们可以利用 SavedStateHandle 以key-value的形式去保存一些 自定义状态 ,从而在进程异常终止,Act重建后,也能获取到之前保存的状态。 至于为什么能实现保存状态呢?...如果当前已创建,则直接使用;反之则调用我们的 ViewModel工厂 create() 方法创建新的 ViewModel。 创建完成后,并将其保存到 ViewModelStore 中。...当我们的 Activity 因为异常生命周期重建时,此时会回调 onSaveInstanceState() 去保存状态,此时 SavedStateRegistryController 就会调用 performSave

76340

1. Jetpack源码解析---看完你就知道Navigation是什么了?

它继承了Navigator,查看注释我们知道它是为每个Navigation设置策略的,也就是说Fragment之间通过导航切换都是由它来操作的,下面会详细介绍的,这里先简单看下。...接下来我们看到为NavController设置setGraph(),也就是我们xml里面定义的navGraph,导航布局里面的Fragment及action跳转等信息。...我们一般手动切换Fragment时可以调用这个方法,最后就是跟踪到这里。...紧接着我们通过setGraph进入到了NavController类中,通过graph里面设置的初始fragment看到了切换栈内切换Fragment的代码。...4.2 类 4.3 分析 4.3.1 NavHostFragment 我们在Activity的布局里面设置了NavHostFragment,同时设置了navGraph布局,经过上面的分析我们知道NavHostFragment

2.2K20

Android面试题到处攒,一到面试就不知深浅忘个干净?快来看看这份超详细整理!

draw()会依次调用四个方法: 1)drawBackground(),根据在 layout 过程中获取的 View 的位置参数,来设置背景的边界。...和scrollY;然后通过scrollTo方法实现滑动;接着又调用postInvalidate方法来进行第二次重绘,和之前流程一样,如此反复导致View不断进行小幅度的滑动,而多次的小幅度滑动就组成了弹性滑动...ViewModel2.0之前 利用一个无view 的HolderFragment来维持它的生命周期,我们知道ViewModel实例是存储到一个ViewModelStore容器里的,那么这个空的fragment...ViewModel,也就是调用ViewModelStore的clear方法。...这些问题不仅会让访问速度变慢,还有可能会导致访问异常,访问页面被替换等等。 16、怎么优化DNS解析 安全优化 总之DNS还是会有各种问题吧,怎么解决呢?就是用HTTPDNS。

1.5K20

Jetpack组件之Navigation

首语 Android开发中流行单个Activity嵌套多个Fragment的UI架构模式,但是对Fragment的管理比较麻烦。...--app:navGraph="@navigation/mobile_navigation"设置Fragment对应的导航图--> <fragment android:id="@+id/...NavController提供了一个名为OnDestinationChangedListener的接口,对页面切换事件进行监听,该接口在页面发生切换或参数改变时<em>调用</em>。...如果该标志已<em>设置</em>,任务返回堆栈就会被清除,并被替换为相应的深层链接页面。与显式深层链接一样。 如果该标记未<em>设置</em>,您仍会位于触发隐式深层链接时所在的上一个应用的任务堆栈中。...destination1.getId()); return navGraph; } 最后,我们还需要处理onBackPressed(),因为返回Navigation会操作回退栈,切换到<em>之前</em>显示的页面

3K20

Android基于DataBinding+Koin实现MVVM模式页面快速开发框架

@App) // 添加 appModule modules(appModule) } } } 代码实现完成,运行效果如下: 跟之前的实现效果一致...为了帮助大家更好的理解我画了一个简单的时序: 从时序图中可以发现核心实现是在 BaseBindingActivity 的 onCreate 中,主要分为以下三步: • 调用 createDataBinding...创建对应布局的 Binding 类,也就是传入的泛型的实例 • 通过 setContentView 将实例化的 Binding 对象的 root View 设置给当前 Activity • 调用子类实现的...: ViewModelStore) : ViewModel?...同样的先看一个简单的时序: 时序图解析: • 事件通过 Activity 传到到 View • Binding 里监听到事件后将事件传递到 ViewModel • ViewModel 中调用父类 BaseViewModel

1.5K20

【翻译】图解Janusgraph系列-事务详解(Janusgraph Transactions)

调用者可以选择放弃ThreadLocal事务管理,转而调用 graph.tx().createThreadedTx(),它返回对事务对象的引用,其中包含读/写数据和提交或回滚的方法。...可能导致事务失败的永久性异常包括: PermanentLockingException(本地锁争用):另一个本地线程已被授予冲突锁。...在事务关闭后访问这些元素将导致异常。如上例所示,必须使用 g.V(existingVertex) 或 g.E(existingEdge) 在新事务中显式刷新此类元素。...buildTransaction()返回一个TransactionBuilder,其允许配置事务的以下方面: readOnly() - 使事务处于只读状态,任何修改图形的尝试都将导致异常。...storage.batch-loading 由于禁用一致性检查和其他优化,此设置导致与图表范围设置类似的效率。

79430

开工!今天撸一波Jetpack下的Lifecycle、ViewModel和LiveData

先看一下这三者的类和相关类的关系: ? 粗一看有些复杂,接下来会详细分析下各个部分负责的内容。...生命周期事件ON_DESTROY, ON_STOP, ON_PAUSE的方法会在LifeCycleOwner对应方法(onDestory()、onStop()、onPause()被调用之前调用。...3.1 setValue() 当调用LiveData的setValue(T value)方法时,将设置LiveData持有的数据。...同时如果之前LiveData已经被设置过数据了,那么观察者会立刻接收到最新的数据。 如果之前LiveData没有观察者观察它,那第一次接受观察者会回调LiveData的onActive()方法。...要移除此Observer时必须手动调用removeObserver()。 ④ postValue(T value):在子线程中给LiveData设置值。

1.5K10

多线程事务死锁问题分析总结(实战应用)

实战回顾 2018年11月28日 有两个客户在两个渠道购买了同一产品每人各买2笔 系统应在29日做成交处理, 成交结束后, 更新一张记录表, 记录表根据产品代码和渠道代码作为Unique...., 而另一个会话因为数据库等待时间过长, 数据也没有进行提交, 最后导致4笔交易全部回滚....隔离性 (可能导致死锁) 简单来说, 两个事务在同时进行更新时,一个事务在更新, 另一个事务需要操作时,不可能看到这条记录之前的值, 需要等到之前的事务要么执行(事务提交),要么不执行(事务回滚...如果一个事务已经存在,则将这个存在的事务挂起(自己一个事务,独立事务) NEVER: 总是非事务地执行,如果存在一个活动事务,则抛出异常(必须由非事务的方法调用) MANDATORY: 如果已经存在一个事务...如果没有一个活动的事务,则抛出异常(必须由带有事务的方法来调用) 画重点 spring的事务管理中, 让我们容易出现问题的几个传播约定 REQUIRED NESTED 1是默认传播机制, 2是嵌套传播机制

1.1K10

厌倦了空指针异常?考虑使用Java SE 8的Optional!

-----------------来自小马哥的故事 ---- 说明 一个聪明的人曾经表示,在处理空指针异常之前,你不是一个真正的Java程序员。...我们来看一个嵌套的对象结构Computer,如图1所示。 ? 1:用于表示a的嵌套结构 Computer 以下代码可能有问题吗?...不幸的是,这意味着调用getUSB()将尝试返回一个空引用的USB端口,这将导致NullPointerException运行时,并阻止程序进一步运行。...结果,调用getUSB()是无效的,因为最外层Optional包含其值Optional,当然不支持该getUSB()方法。3说明了Optional您将获得的嵌套结构。 ?...我们从编写痛苦的嵌套空白检查到编写能够组合,可读和更好地保护空指针异常的声明性代码已经走了很长的路。

1.3K31

安卓Navigation系列——入门篇

前言 在日常开发中,越来越多的会使用到一个activity嵌套多个fragment的场景,典型的例子就是app的首页,一般都会由一个activity+多个子tab组成,那对于Fragment的显示、隐藏等我们通常都是通过...组成三要素 Navigation graph 一个包含所有导航相关信息的 XML 资源 NavHostFragment 一种特殊的Fragment,用于承载导航内容的容器 NavController 管理应用导航的对象...kotlin-android' id 'kotlin-android-extensions' } 可以看到,通过navController管理fragment的跳转非常简单,首先得到navController对象,然后调用它的...navigation创建深度链接可以通过显示和隐式两种方式 按之前的方式新建一个需要通过深度链接打开的目标页面FragmentDeepLink, 接下来为它创建一个deeplink [le26d0eia6...bundle.putString("key", "deeplink") val pendingIntent = deepLinkBuilder //传入graph资源文件 .setGraph

2K51

vue项目创建步骤 和 路由router知识点

菜单快捷导航: vue项目创建 vue路由router知识点(路径参数、查询参数、命名路由、嵌套路由、命名视图、hash/history模式) vue导航守卫(全局守卫、单个路由独享、组件级守卫) 1、...$route) } }   效果: ? 2.5 编程式的导航。...守卫是异步解析执行,此时导航所在所有守卫resolve完之前一直处于等待中。 每个守卫方法接收三个参数: to: Route: 即将要进入的目标 路由对象。...3.2 全局解析守卫: router.beforeResolve  ,这和 router.beforeEach 类似,区别是在导航被确认之前,同时在所有组件内守卫和异步路由组件被解析之后,解析守卫就被调用...在被激活的组件里调用 beforeRouteEnter 。 调用全局的 beforeResolve 守卫 (2.5+)。 导航被确认。 调用全局的 afterEach 钩子。 触发 DOM 更新。

2K40
领券