协程切换导致值丢失


#1

workHandler中使用协程切换到主线程,会导致值丢失。谁能帮忙解释下原因。

code见下文:

WorkHandler为一个Service类的内部类。WeakRefHandler为自定义的常规的弱引用Handler。

private inner class WorkHandler(looper:Loop, out:MyService):WeakRefHandler<MyService>(looper, out) {

   override fun handleMessage(msg:Message, ref:MyService) {
         when(msg.what) {
                XXXX-> {
                         //1、值丢失的写法
                        launch{  // launch会将工作任务切换到MainScope
                                ref.function(msg.arg1)   //此时function方法中接收到的参数一直为0
                        }

                        //2、正常的写法
                        val arg = msg.arg1
                        launch{
                                ref.function(arg) //此时function方法中接收到的参数值正常
                        }
                }
         }
   }
}

谁能帮忙解释下为什么第一种使用方式会导致值丢失,而第2中方式正常。


#2

Messgae 对象 可能被重用了


#3

说的对。


京ICP备16022265号-2 Kotlin China 2017 - 2018