Kotlin: Jetpack — LiveData简单应用

LiveData 概览 Android Jetpack 的一部分。

LiveData 是一种可观察的数据存储器类。与常规的可观察类不同,LiveData 具有生命周期感知能力,意指它遵循其他应用组件(如 activity、fragment 或 service)的生命周期。这种感知能力可确保 LiveData 仅更新处于活跃生命周期状态的应用组件观察者。

API:LiveData 概览 | Android 开发者 | Android Developers

代码:

Kotlin 复制代码
class MainActivity : AppCompatActivity() {

    // 观察数据 当数据发生改变时 更新数据

    //声明liveData 数据感知 MutableLiveData<T> extends LiveData<T>
    val mliveData=MutableLiveData<String>()

    val liveMapData:LiveData<Pair<Int,String>> = mliveData.map {
        //hashCode 哈希码
        Pair<Int,String> (it.hashCode(),it)
    }

    val liveMapData2:LiveData<String> = mliveData.map {
        //最后6个字符
        "liveMapData2 ${it.takeLast(6)}"
    }


    //声明liveData 数据感知  默认值
    val liveTwo = MutableLiveData<String>().apply {
        value = "666"
    }
    val liveOne = MutableLiveData<String>().apply {
        value = "888"
    }
    //switchMap 通过条件,控制选择数据源666 or 888
    val switchLiveData:LiveData<String> = liveMapData.switchMap {
        if (it.second.takeLast(1).toInt() % 2 == 0) liveTwo else liveOne
    }


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

        //获取到xml主布局中的所有的view 用了DataBinding
//        binding = DataBindingUtil.setContentView(this,R.layout.activity_main);
        //ViewDataBinding
        val binding:ActivityMainBinding = DataBindingUtil.setContentView(this,R.layout.activity_main)
 // Create the observer which updates the UI.
        val nameObserver = Observer<String> { newName ->
            // Update the UI, in this case, a TextView.
            Log.i("TAG","----触发了察者---")
            binding.tvcont.text = newName
        }
        // Observe the LiveData, passing in this activity as the LifecycleOwner and the observer.
        model.currentName.observe(this, nameObserver)

        //按钮点击事件 模拟数据发生改变    更新 LiveData 对象
        binding.btnUpdate.setOnClickListener{
            val anotherName = "John Doe"
            //更改数据
            model.currentName.setValue(anotherName)


            //更改数据
            mliveData.value = System.currentTimeMillis().toString()

        }

        /**java 代码
         * myViewModel.getData().observe(this, new Observer<Integer>() {
            @Override
             public void onChanged(Integer integer) {
             //内容发生改变
            textView.setText (String.valueOf(integer));
            }
            });
         */
        //观察mliveData 数据发生改变时 把数据显示在text中
        mliveData.observe(this,Observer{
            Log.i("TAG","--mliveData--触发了观察  数据发生了改变---$it")
            binding.tv6.text = it
        })

        //观察 liveMapData map转换后的数据
        liveMapData.observe(this, Observer {
            Log.i("TAG","--liveMapData map转换后的数据--触发了观察  数据发生了改变---$it")
            binding.tv7.text = it.toString()
        })

        //观察liveMapData2    数据发生改变时 把数据显示在text中
        liveMapData2.observe(this, Observer {
            Log.i("TAG","--liveMapData map转换后的数据--触发了观察  数据发生了改变---$it")
            binding.tv8.text = it.toString()
        })

        //观察switchLiveData  数据发生改变时 把数据显示在text中
        switchLiveData.observe(this, Observer {
            Log.i("TAG","--switchLiveData--触发了观察  数据发生了改变---$it")
            binding.tv9.text = it
        })

    }
}
相关推荐
前行的小黑炭11 小时前
Android:在项目当中可能会遇到的ANR,应该如何解决?
android·java·kotlin
老衲不服15 小时前
android 三方sdk minSdkVersion 兼容问题处理
android
wan5555cn17 小时前
多张图片生成视频模型技术深度解析
人工智能·笔记·深度学习·算法·音视频
android_xc18 小时前
Android Studio国内仓库配置
android·ide·android studio
FunnySaltyFish18 小时前
Kotlin 2.2.20 上新:新contract、跨平台编译稳定、默认Swift导出……
kotlin
alexhilton18 小时前
runBlocking实践:哪里该使用,哪里不该用
android·kotlin·android jetpack
2501_9151063219 小时前
iOS 使用记录和能耗监控实战,如何查看电池电量消耗、App 使用时长与性能数据(uni-app 开发调试必备指南)
android·ios·小程序·uni-app·cocoa·iphone·webview
雨白19 小时前
深入解析 Android 多点触摸:从原理到实战
android
雁于飞19 小时前
vscode中使用git、githup的基操
笔记·git·vscode·学习·elasticsearch·gitee·github
rannn_11119 小时前
【Javaweb学习|实训总结|Week1】html基础,CSS(选择器、常用样式、盒子模型、弹性盒布局、CSS定位、动画),js(基本类型、运算符典例)
css·笔记·学习·html