java 局部变量问题

本文探讨了Android开发中的局部变量与成员变量的存储位置,以及LiveData的观察者模式。在示例中,由于局部变量随方法调用栈的变化而消失,导致在第二次点击按钮时,尽管成员变量`y`已更新,但局部变量`i`的值并未改变,从而在LiveData的回调中仍然打印出旧值。这体现了栈内存的短暂性和LiveData对生命周期的管理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

局部变量的解释就不多说了,直接说其中两个点:

1.局部变量储存在栈中而成员变量在堆内存中

2.局部变量:随着方法进栈而诞生,随着方法出栈而消失,局部变量:随着方法进栈而诞生,随着方法出栈而消失

val single = SingleLiveEvent<String>()
    var y = 0

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        val bt = findViewById<AppCompatButton>(R.id.bt)
        bt.setOnClickListener { onclicks() }

        val bt1 = findViewById<AppCompatButton>(R.id.bt1)
        bt1.setOnClickListener { onclick1() }

        initview()
    }

    private fun initview() {
        var i = 0

        if (y == 0) {
            i = 0
        }
        if (y == 1) {
            i = 1
        }
        Log.e("mlt","............${i}.....")
        single.observe(this,{
            Log.e("mlt",".....222222.......${i}.....")
        })
    }

    fun onclicks () {
        y = 1
        initview()
    }

    fun onclick1 () {
        single.value = "1"
    }

livedata是经过封装的,值在setValue的时候才会执行,那么点击onclicks之后再点击onclick1会打印什么?

2021-10-13 16:24:18.107 11482-11482/com.text.text E/mlt: ............0.....
2021-10-13 16:24:19.607 11482-11482/com.text.text E/mlt: ............1.....
2021-10-13 16:24:21.464 11482-11482/com.text.text E/mlt: .....222222.......0.....
2021-10-13 16:24:23.604 11482-11482/com.text.text E/mlt: ............1.....
2021-10-13 16:24:24.047 11482-11482/com.text.text E/mlt: .....222222.......0.....
2021-10-13 16:24:25.398 11482-11482/com.text.text E/mlt: ............1.....
2021-10-13 16:24:26.058 11482-11482/com.text.text E/mlt: .....222222.......0.....

最后一直都是0,为啥不是1呢,明明已经改变变量的值了,再livedata的时候没有改变呢?

其实根据上面的解释应该能明白 局部变量:随着方法进栈而诞生,随着方法出栈而消失

在第一次点击的时候值是改变的,但在第二次点击的时候,相当于已经重新调用方法,之前的变量已经出栈消失了,再次调用还是初始值!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值