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

Android面试官问,你会如何选择应对这些高级问题?

异常处理机制: 通过try-catch块捕获异常,确保异常不会导致整个应用崩溃。 使用SupervisorJob可以让子的异常不影响父,保证异常的隔离性。...可以通过CoroutineExceptionHandler来全局处理中未捕获的异常。 RxJava的比较 问题: RxJava在异步编程中有什么异同?...在什么情况下更适合使用RxJava? 出发点: 可以从语法、错误处理等方面展开,适用场景可以根据各自的优点进行应用。...错误处理: 使用try-catch块捕获异常,而RxJava使用onError处理错误。 背压: RxJava有背压策略来处理生产者和消费者之间的速度不一致,而可以通过挂起来实现类似的效果。...在什么情况下应该考虑使用池?

26810

破解 Kotlin (4) - 异常处理篇

究竟使用什么 Scope,大家自己根据实际情况来确定,给出一些建议: 对于没有作用域,但需要启动的时候,适合用 GlobalScope 对于已经有作用域的情况(例如通过 GlobalScope...启动的体内),直接用启动器启动 对于明确要求子程之间相互独立不干扰使用 supervisorScope 对于通过标准库 API 创建的,这样的比较底层,没有 Job、作用域等概念的支撑...,进而将整个协作用域取消掉,如果对 coroutineScope 整体进行捕获,也可以捕获异常,所谓“一损俱损”;如果是 supervisorScope,那么子的异常不会向上传递,所谓“自作自受...join 和 await 的不同:join 只关心是否执行完,await 则关心运行的结果,因此 join 在出现异常也不会抛出异常,而 await 则会;考虑到作用域的问题,如果抛异常...附加说明 join 在父被取消时有一个 bug 会导致不抛出取消异常,在准备本文发现问题,目前已经提交到官方并得到了修复,预计合入到 1.2.1 发版,大家有兴趣可以查看这个 issue:No

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

即学即用Kotlin -

概念 相信大家或多或少的都了解过,什么,官网上这么说: “Essentially, coroutines are light-weight threads. 是轻量级的线程,为什么是轻量的?...可以使用阻塞的方式写出非阻塞式的代码,解决并发中常见的回调地狱,这是其最大的优点,后面介绍。 2....那我们什么时候需要使用挂起函数呢?常见的场景有: 耗时操作:使用 withContext 切换到指定的 IO 线程去进行网络或者数据库请求。 等待操作:使用delay方法去等待某个事件。...除了简单的用法外,这里有两个问题得注意一下: collect 函数是一个 suspend 方法,所以它必须发生在或者带有 suspend 的方法里面,这也是什么在一开始的时候启动了 lifecycleScope.launch...lifecycleScope 是使用的 Lifecycle 的扩展库当中的,你可以替换成自定义的作用域。 2.

1.5K20

快速进阶 Kotlin Flow:掌握异步开发技巧

在 Kotlin Flow 中,你可以使用 catch 操作符来捕获和处理异常,确保应用的稳定性。...Kotlin Flow 集成了 Kotlin 的取消机制,使得取消操作变得简单而高效。 使用作用域 在 Flow 中进行取消操作,建议使用作用域来确保操作的一致性。...集成 Kotlin Flow 是 Kotlin 的一部分,因此它天生与 Kotlin 无缝集成。这意味着你可以在同一个代码块中使用和 Flow,实现更加一致和清晰的异步编程。...热流在数据产生后传递给所有订阅者,即使在订阅之后也可以接收之前的数据。RxJava 也有类似的概念,但在使用时需要特别注意避免潜在的内存泄漏和资源浪费。...而在 Kotlin Flow 中,你可以使用 flowOn 操作符来实现线程切换。两者的使用方式相似,但 Kotlin Flow 可以更加自然地与集成,避免了额外的配置。

69930

大揭秘,Android Flow面试官最爱问的7个问题

Flow的核心概念 问题: 请解释Flow是什么,与传统的RxJava相比有何优势? 出发点: 在回答这个问题,应当强调对Flow的理解以及与RxJava的对比。...参考简答: Flow是一种基于的响应式编程库,用于处理异步数据流。与RxJava相比,Flow的优势在于其与的深度集成,提供更加简洁、直观的API。...通过使用catch操作符,可以捕获流中的异常并进行处理。需要注意的是,catch是在上下文中执行的,因此可以使用的异常处理机制。...在不同中更新StateFlow会有什么问题? 出发点: 这个问题考察面试者对于StateFlow的线程安全性的认识,以及在实际使用中需要注意的事项。...Mutex确保在不同中更新StateFlow的同步性,可以有效避免竞态条件。

18221

RxHttp ,比Retrofit 更优雅的体验

,再有就是多个注解非法在一起使用时,只有在编译期间才能给我们明确的错误,这也是刚上手Retrofit比较头疼的一点。...而且对于UI来说,只需要data字段即可,错误提示啥的管不着。 那有没有什么办法,能直接拿到data字段,并且对code做出统一判断呢?...亦或者说,不是很懂,你只要保证安全的前提下,告诉怎么用就行了,ok,那下面如何安全的开启一个,做到自动异常捕获,且页面销毁,自动关闭及请求 4、开启及关闭 ========= 对于的开启...,Jetpack库里提供了lifecycle-runtime-ktx、lifecycle-viewmodel-ktx这两个框架,可以非常方便的开启,并在页面销毁自动关闭,如下: // FragmentActivity...)中的任一版本(v4.3.0除外,版本有一个bug,导致无法适配),因此,使用RxHttp,完全不用担心okhttp版本冲突问题。

2K20

中的取消和异常 | 异常处理详解

如果它的子抛出了一个异常,就会导致 UI 作用域 (UI scope) 被取消,并且由于被取消的作用域无法开启新的,所有的 UI 组件都会变得无法响应。...如果您不希望这种事情发生,可以尝试在创建在 CoroutineScope 的 CoroutineContext 中使用 Job 的另一个扩展: SupervisorJob。...如果您想要在出现错误时不会退出父级和其他平级的,那就使用 SupervisorJob 或 supervisorScope。...而如果您在扩展中使用 coroutineScope 代替 supervisorScope ,错误就会被传播,而作用域最终也会被取消。 小测验: 谁是的父级?...△ Child 1 和 Child 2 的父级是 Job 类型,不是 SupervisorJob 这样一来,无论 Child 1 或 Child 2 运行失败,错误都会到达作用域,所有作用域开启的都会被取消

1K20

Google 推荐在 MVVM 架构中使用 Kotlin Flow

,造成内存泄露是很正常的事,大家可以从 StackOverflow 上查看一下,有很多因为 RxJava 造成内存泄露的例子 RxJava 入门的门槛很高,学习过的朋友们,相信能够体会到从入门到放弃是什么感觉...Flow 是的扩展,如果要在 Room 和 Retrofit 中使用,Room 和 Retrofit 需要支持可以,在 Retrofit >= 2.6.0 和 Room >= 2.1 版本都支持...fetchPokemonInfo(@Path("name") name: String): NetWorkPokemonInfo 如上所见在方法前增加了用 suspend 进行了修饰,只有被 suspend 修饰的方法,才可以中调用...,使用 LiveData 构造方法 (coroutine builder),这个方法也是在 PokemonGo 项目中用到的方法。...RxJava 的小伙伴们应该会非常熟悉,对于没有使用RxJava 的小伙伴们,入门的门槛也是非常低的,强烈建议至少体验一次,体验过之后,认为你会跟我一样爱上它的。

4.1K20

再谈程之异常到底怎么办

而如果只想取消某个单独的,那么可以通过的句柄Job对象来取消。...所以,推荐开发者在使用,以协作的方式来使用,即随时判断当前的生命周期,避免浪费计算资源。...❞ 这里有个误区,那就是大家不要以为使用SupervisorJob之后,就不会崩溃,不管你用什么Job,崩溃的还是要崩溃的,它们的差别在于是否会影响到别的,例如下面这个例子。...launch:通过launch启动的异常可以通过try catch来进行异常捕获,或者使用封装的拓展函数runCatching来捕获,其内部也是使用的try catch。...CoroutineExceptionHandler,当它的子发生异常,即使不使用try catch,异常也会被捕获

65410

禁止在代码中使用异常,一次时隔7年的复盘

甚至是某些全栈的评委在评论前端代码依然评论某某函数没有检查错误码之类可笑荒唐的言论,这样的言论可以被任何一个前端开发非常轻易且不屑的反驳掉:动态业务模型中并没有体现此处异常的处理,什么要检查这样的异常...——即在网络等待没有进行切换,影响并发效率。...另外一个思考点是,如果在抛出异常和捕获异常之间出现切换,会发生什么效果呢?我们把处理函数重写一下,使用 RAII 的思想在块超出作用域进行切换。...,但由于无法保证逐帧回溯产生切换(例如某段代码来一个析构 RPC 远程上报一把),请避免使用全局变量或线程本地变量; 如果切换依然是同一个函数,逐帧回溯、异常处理都会导致写到不同的全局变量或线程本地变量...但在动态分析一节中告诉我们,不要在捕获块代码的切换后再使用异常对象,因为它有可能已经被析构,不再有效。 1.3.4 重新分析当初的复盘结论 使用异常导致冲突,捕获到异常和抛出的不一致。

2.3K34

关于 Kotlin Coroutines, 你可能会犯的 7 个错误

但是,发现了许多开发者在使用时会犯一些通用性的错误。 1. 在使用实例化一个新的 Job 实例 有时候你会需要一个 job 来对进行一些操作,例如,稍后取消。...为什么会这样? 原来,为了让异步/同步代码更加安全,提供了革命性的特性 —— “结构化并发” 。“结构化并发” 的一个机制就是:当作用域被取消,就取消作用域中的所有。...错误使用 SupervisorJob 有时候你会使用 SupervisorJob 来达到下面的效果: 在 job 继承体系中停止异常向上传播 当一个失败不影响其他的同级 由于构建器 launch...还作了一些 图[10] 来总结这个复杂的话题。 关于 Kotlin 异常处理最不直观的方面之一是,你不能使用 try-catch 来捕获异常。...catch 分支不仅会捕获错误网络请求的 HttpException ,对于 CancellationExceptions 也是。因此不会 “异常停止”,而是继续运行。

89620

go中异常处理流程

这是由于 Go 使用了处理异常的机制,而不是像传统的错误处理机制那样需要在每个函数中检查错误。在 Go 中,panic 主要用于表示程序遇到无法继续执行的错误情况。...虽然一个中发生了 panic,但其他仍然可以继续执行。4. 总结在Go中,runtime包是负责处理Go运行时(runtime)的细节,包括垃圾回收、调度等。...在处理panic,需要注意以下几点:panic通常表示程序中存在无法恢复的错误,因此应该尽量避免在正常的程序逻辑中使用panic。...recover函数只能在(goroutine)的执行过程中使用,并且只能捕获当前中的panic。当一个出现panic,其它不会受到影响,会继续独立执行。...正在参与2023腾讯技术创作特训营第三期有奖征文,组队打卡瓜分大奖!声明:本作品采用署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0)进行许可,使用时请注明出处。

16920

Python3中的生成器进阶(sendclosethrow)

C10M问题 随着互联网的发展,C10K的并发已经不能满足日常需要,于是产生了新的挑战,即C10M问题:如何利用8核CPU,64G内存,在10gbps的网络上保持1000万的并发连接,这时候就产生了... ,有人说它是有多个入口的函数,也有人说它是可以暂停的函数,且可以向暂停的地方传入值,它这种函数执行不再是依赖于栈。”可以暂停的函数”?生成器可以暂停啊,是的,那么生成器是如何变成的呢?...那么在使用生成器,第一次为什么要发送一个值为None的变量呢?...先不管是什么坑,按照之前的逻辑这里除了,那我们就捕获一下呗: def generate_func(): yield "http://www.baidu.com" # 1、可以产出值;2、可以接收值...,但是大家对于到底在哪里出了,以及出的什么更加深刻了。

1K20

干货 | 携基于Quasar的NIO实践

业务系统需要类似于线程的同步等待,同时具有低资源消耗的编码工具,配合 NIO使用。当时使用NIO,由于可以不占用线程,可以使用一种资源消耗更小的来等待。...中调用的方法是可以挂起的。不同于线程的阻塞会使线程休眠,在等待异步任务的结果,会通知调度器将自己放入挂起队列,释放占用的线程以处理其他的。...使用者必须逐层抛出异常直至新建的一层。当方法内部存在try/catch语句,也必须抛出异常。...对于某些暂时只能依靠阻塞IO的调用,如数据库,消息队列等,无法使用等待其结果,当这些阻塞操作量不大的情况下,可使用另一个可伸缩的线程池等待结果,避免对调度器的影响。...代码的try/catch可能同时捕获SuspendExecution异常,从而忘记标记方法,此方法字节码不会被修改,结合Quasar的原理不难看出,当没有织入字节码,挂起方法恢复执行,无法还原方法栈帧和执行状态

1.5K30

Android实现异步的几种方式——从简单的图片加载说起

使用subscribeOn和observeOn进行线程切换。 使用RxJava的好处是很轻松得实现线程切换,还可以指定线程,有异常捕获机制。...但对于不熟悉RxJava的朋友来说会有些… Kotlin 最后要安利一个非常酷炫的方式,那就是Kotlin。...标准库为kotlin.coroutines.experimental(写作使用kotlin-1.20版本),可见仍然还是一个实验性功能。...cancel() } 不由得想感叹一下,使用做轻量的异步操作,简直爽到不行。 但毕竟可能还是了解不多,不免会有一些坑的出现,但多去了解和使用,想必也是很酷的。...小结 从个人感觉来说,比较推荐使用RxJava和协来实现,处理周密的话,轻松避免资源浪费和内存泄漏。

1.4K61

「Go框架」gin框架是如何处理panic的?

大家好,是渔夫子。 本文我们介绍下recover在gin框架中的应用。首先,在golang中,如果在子中遇到了panic,那么主也会被终止。...那么,如何能够做到发生panic技能捕获panic又能让服务继续健康运行呢? 这就是golang中提供的recover函数了。recover函数能够捕获Panic错误并恢复程序的正常运行。...在gin中,是通过使用中间件来捕获panic,并保证服务不down机的。如果使用gin.Default()函数进行构建gin对象,那么默认就注册了Recovery中间件。...即指错误的输出到什么地方。...因为defer是在函数返回才调用,所以当发生panic时会导致函数返回,这样才能捕获panic。

44940

Lua:,coroutine.create,coroutine.resume, coroutine.yield

其唯一的参数是的主函数。 create 函数只负责新建一个并返回其句柄 (一个 thread 类型的对象); 而不会启动。...的运行可能被两种方式终止: 正常途径是主函数返回 (显式返回或运行完最后一条指令); 非正常途径是发生了一个未被捕获错误。...对于正常结束, coroutine.resume 将返回 true, 并接上主函数的返回值。 当错误发生, coroutine.resume 将返回 false 与错误消息。...让出,对应的最近 coroutine.resume 函数会立刻返回,即使让出操作发生在内嵌函数调用中 (即不在主函数,但在主函数直接或间接调用的函数内部)。...和 coroutine.resume 不同, coroutine.wrap 不会捕获错误; 而是将任何错误都传播给调用者。

14930

Kotlin | 关于异常处理,你想知道的都在这里

当然如果不想在异常,同级别子或者父受到影响,此时就可以使用 SupervisorJob ,这个我们放在下面再谈。...结果是不能 为什么? 不是已经使用了 SupervisorJob() 吗?...,如果 async 对应的是根,那么我们可以在 await() 直接捕获异常。...如果此时我们为其增加 SupervisorJob() ,则标志着其不会主动传递异常,而是由自行处理。所以我们可以在调用处(await()) 捕获。...如下示例: 当子A 异常未被捕获,此时 子B 和整个 作用域 都将被异常取消,此时异常将传递到顶级 CoroutineExceptionHandler 场景推荐 严格意义上来说,所有异常都可以

75720

在 Android 开发中使用 | 上手指南

任务泄漏 (work leak) 是指某个协丢失无法追踪,它类似于内存泄漏,但比它更加糟糕,这样丢失的可以恢复自己,从而占用内存、CPU、磁盘资源,甚至会发起一个网络请求,而这也意味着它所占用的这些资源都无法得到重用...在 Android 平台上,我们可以使用结构化并发来做到以下三件事: 取消任务 —— 当某项任务不再需要时取消它; 追踪任务 —— 当任务正在执行时,追踪它; 发出错误信号 —— 当失败,发出错误信号表明有错误发生...当用户通过导航离开某界面,与界面相关的 CoroutineScope 可以取消掉所有不需要的任务。 结构化并发能够保证当某个作用域被取消后,它内部所创建的所有也都被取消。...注意: 被挂起,系统会以抛出 CancellationException 的方式协作取消协捕获顶级异常 (如Throwable) 的异常处理程序将捕获此异常。...跟常规函数一样,您不仅可以使用 try/catch 这样的方式来处理错误,还可以构建抽象来按照您喜欢的方式进行错误处理。 但是,在某些情况下,还是有可能会弄丢获取到的错误的。

1.4K20
领券