android - obj.apply{ func1() } 的结果与 obj.func1() 不同

标签 android kotlin android-lifecycle

在 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). And this 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/

相关文章:

java - Android:网络浏览器中的 GPS

android - 为什么在 Android 绑定(bind)示例中 Google 使用 val 绑定(bind)和 var _binding?

android - org.jetbrains.kotlin.util.KotlinFrontEndException : Exception while analyzing expression

Android:使用支持 fragment 管理器时复制 fragment

安卓构造器

java - 如何从 AsyncTask 更新 View ?

Android:从堆栈中删除 Activity

kotlin - 在runBlocking中使用coroutineScope有什么效果?

java - 如何解决库根依赖的gradle依赖冲突?

android - 即使 loadInBackground 返回正确的数据,也会使用错误的数据调用 onLoadFinished