在 kotlin 中,apply{}
定义为inline fun <T> T.apply(block: T.() -> Unit): T
我以为使用这个函数就是为了尽量减少这段代码
obj.func1()
obj.func2()
obj.func3()
...
至
obj.apply {
func1()
func2()
func3()
}
但现在我认为它有一些完全不同的实际用例。在我的 android studio 项目中,我得到了这个日志
2020-12-08 13:3:22.648 28006-28006/com.skb.skara D/VideoViewActivity: onStart: pos 2677
2020-12-08 13:3:22.649 28006-28006/com.skb.skara D/VideoViewActivity: initializePlayer: seeked to 0
2020-12-08 13:3:22.650 28006-28006/com.skb.skara D/VideoViewActivity: onStart: pos 2677
对于此代码
private var currentPosition: Int
override fun onStart() {
super.onStart()
Log.d(TAG, "onStart: pos $currentPosition")
initializePlayer()
Log.d(TAG, "onStart: pos $currentPosition")
if (currentPosition == 0) {
Log.d(TAG, "onStart: vid start")
fullscreen_video.start()
}
show()
}
private fun initializePlayer() {
fullscreen_video.apply {
setVideoPath(videoUrl)
seekTo(currentPosition)
Log.d(TAG, "initializePlayer: seeked to $currentPosition")
}
}
然后我改变了initialisePlayer
函数到此
private fun initializePlayer() {
fullscreen_video.setVideoPath(videoUrl)
fullscreen_video.seekTo(currentPosition)
Log.d(TAG, "initializePlayer: seeked to $currentPosition")
}
然后我得到了这个日志
2020-12-08 13:12:53.548 28006-28006/com.skb.skara D/VideoViewActivity: onStart: 2677
2020-12-08 13:12:53.550 28006-28006/com.skb.skara D/VideoViewActivity: initializePlayer: seeked to 2677
2020-12-08 13:12:53.550 28006-28006/com.skb.skara D/VideoViewActivity: onStart: 2677
请有人解释一下这种行为,并解释一下作用域函数的使用 apply{}
最佳答案
小心,VideoView
有自己的currentPosition 。访问currentPosition
在其apply
内 block 将获取 VideoView
的 currentPosition .
private fun initializePlayer() {
fullscreen_video.apply {
setVideoPath(videoUrl)
seekTo(currentPosition) // This will use VideoView.currentPosition
Log.d(TAG, "initializePlayer: seeked to $currentPosition") // This, too
}
}
解释一下apply
:
The context object is available as a receiver (
this
). Andthis
always can be omitted.
如果您想访问currentPosition
您在上面声明,请使用 <a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="116579786251487e646350726578677865683f72646363747f65417e627865787e7f" rel="noreferrer noopener nofollow">[email protected]</a>
。替换YourActivity
与您的 Activity 。
关于android - obj.apply{ func1() } 的结果与 obj.func1() 不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65195156/