精选国外大厂面试题,你能说出正确答案吗?
The following article is from ByteCode Author 程序员DHL
习惯性的每天都会打开 medium 看一下技术相关的内容,偶然看到一位大佬分享和 Android Lifecycle 相关的面试题,觉得非常的有价值。
面试题一:Launch Fragment by Default
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
supportFragmentManager
.beginTransaction()
.replace(R.id.container, MainFragment())
.commit()
}
}
没有使用 KTX 添加 Fragment 应该使用 .add 而不是 .replace
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
if (savedInstanceState == null) {
supportFragmentManager
.beginTransaction()
.replace(R.id.container, MainFragment())
.commit()
}
}
}
面试题二:Create Fragment with Constructor
supportFragmentManager
.beginTransaction()
.replace(R.id.container, MainFragment())
.commit()
class MainFragment(private val repository: Repository): Fragment() {
}
我们可以使用 .replace(R.id.container, MainFragment(repository)) 方法来代替。 它不会编译和运行。
Caused by: java.lang.NoSuchMethodException: MainFragment.<init>
面试题三:Instantiate ViewModel Directly
class MainActivity: AppCompatActivity() {
private val viewModel = MainViewModel()
}
class MainViewModel(): ViewModel {
}
没有什么问题,可以正常编译运行。 我们还需要向它注入一些依赖项,例如 MainViewModel (repository)。
class MainActivity: AppCompatActivity() {
private val viewMode:MainViewModel by viewModels()
}
by viewModels () 会在重新启动或从已杀死的进程中恢复时,实例化一个新的 ViewModel。如果有配置更改,例如设备被旋转时,它将检查 ViewModel 是否已经创建,而不重新创建它。
ViewModels() 会根据需要自动注入 SavedInstancestate (例如 Activity 中的 SavedInstanceState 和 Intent),如果我们有其他依赖是通过 Dagger Hilt 注入,它将与 ViewModel 一起使用下面的参数。
@HiltViewModel
class MyViewModel @Inject constructor(
private val repository: Repository,
savedStateHandle: SavedStateHandle
) : ViewModel {
}
面试题四:ViewModel as StateRestoration Solution
class MainActivity: AppCompatActivity() {
private val viewMode:MainViewModel by viewModels()
// Some other Activity Code
}
面试题五:LiveData as State Restoration Solution
// Declaring it
val liveDataA = MutableLiveData<String>()
// Trigger the value change
liveDataA.value = someValue
@HiltViewModel
class MyViewModel @Inject constructor(
private val repository: Repository,
savedStateHandle: SavedStateHandle
) : ViewModel {
// Some other ViewModel Code
}
val liveData = savedStateHandle.getLiveData<String>(KEY)
val stateFlow = savedStateHandle.getStateFlow<String>(KEY, 0)
面试题六:When is The View Destroyed But Not the Instance
当配置发生变化时(例如设备旋转)。 当内存不足时,App 在后台运行,进程会杀死 App。
问题七:Lifecycle Aware Coroutine
对于普通视图,只需在 Activity 或 Fragment 中使用 lifecycleScope,在 ViewModel 中使用 viewModelScope。 对于组合视图,需要使用 stateFlow 中的 collectAsState() 方法,因为当可组合函数不活动时,它不会收集。
lifecycleScope.launch {
repeatOnLifecycle(Lifecycle.State.STARTED) {
viewModel.stateFlowValue.collect {
// Do something
}
}
}
全文到这里就结束了,感谢你的阅读,坚持原创不易,欢迎 在看、点赞、分享 给身边的小伙伴,我会持续分享原创干货!!!
最后推荐一下我做的网站,玩Android: wanandroid.com ,包含详尽的知识体系、好用的工具,还有本公众号文章合集,欢迎体验和收藏!
推荐阅读:
点击 关注我的公众号
如果你想要跟大家分享你的文章,欢迎投稿~
┏(^0^)┛明天见!