android MutableLiveData与AndroidViewModel避坑小提示,Java

news/2024/10/20 15:48:55/

android MutableLiveData与AndroidViewModel避坑小提示,Java

 

import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import androidx.lifecycle.AndroidViewModel;
import androidx.lifecycle.LifecycleOwner;
import androidx.lifecycle.MutableLiveData;
import androidx.lifecycle.Observer;import android.app.Application;
import android.os.Bundle;
import android.os.SystemClock;
import android.util.Log;public class MainActivity extends AppCompatActivity {private String TAG = "fly";private MyData myData = new MyData();@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);MyModel myModel = new MyModel(this.getApplication());myData.observe(this, new Observer<String>() {@Overridepublic void onChanged(String s) {Log.d(TAG, "onChanged - " + s);}});myModel.start();}private class MyData extends MutableLiveData<String> {@Overridepublic void setValue(String value) {super.setValue(value);Log.d(TAG, "setValue - " + value);}@Overridepublic void postValue(String value) {super.postValue(value);Log.d(TAG, "postValue - " + value);}@Overridepublic void observe(@NonNull LifecycleOwner owner, @NonNull Observer<? super String> observer) {super.observe(owner, observer);Log.d(TAG, "observe");}@Overrideprotected void onActive() {super.onActive();Log.d(TAG, "onActive");}@Overrideprotected void onInactive() {super.onInactive();Log.d(TAG, "onInactive");}}public class MyModel extends AndroidViewModel {public MyModel(@NonNull Application application) {super(application);}public void start() {for (int i = 0; i < 3; i++) {myData.postValue("a " + i);SystemClock.sleep(100);}SystemClock.sleep(1000);for (int i = 5; i < 8; i++) {myData.setValue("b " + i);SystemClock.sleep(100);}}}
}

 

输出:

8d0d2ee9cb6e4b7eb16339a9e303c4a5.png

 

(1)setValue()必须在UI主线程调用。而postValue()则可以在后台线程(非UI线程)调用。

(2)setValue()在postValue()之后。

(3)在LiveData设置(UI线程)数据任务之前,如果postValue()了多次数据,但只有最后一个数据会被分发主线程设置。可以简单的理解为,postValue()最终的数据呈现是setValue()实现。

(4)当potsValue()之后,getValue()不一定会取到在postValue()的数据,只有当主线程setValue()之后,才能取到postValue()的值。也就是说,除非主线程setValue()了postValue()的值,否则取不到。

 

Android LiveData简介(一)_livedata onactive_zhangphil的博客-CSDN博客Android LiveData简介(一)使用Android的LiveData,需要在gradle添加引用: compile "android.arch.lifecycle:runtime:1.0.0" compile "android.arch.lifecycle:extensions:1.0.0" annotationProcessor "android.arch.lifhttps://blog.csdn.net/zhangphil/article/details/78592235

Google I/O Android官方新体系架构之:Lifecycle_android google lifecycle_zhangphil的博客-CSDN博客Google I/O 2017 Android官方新体系架构之:LifecycleGoogle官方在2017 I/O大会中引入一些列Android新的体系架构内容,其中有一个是Android的Lifecycle。Lifecycle实现的一个重要目的,是实现Android的与Activity和Fragment生命周期相关的逻辑控制进一步的解耦。简单的理解,以前因为要写于Android activithttps://blog.csdn.net/zhangphil/article/details/77049812

 


http://www.ppmy.cn/news/96577.html

相关文章

《Linux0.11源码解读》理解(四) head之重新设置IDT/GDT

上节提到&#xff0c;现在cs:ip指向0地址&#xff0c;此处存储着作为操作系统核心代码的system模块&#xff0c;是由head.s和 main.c以及后面所有源代码文件编译链接而成。head.s(以下简称head)紧挨着main.c&#xff0c;我们先执行head。 重新设置内核栈 _pg_dir: _startup_3…

SAP-MM-采购申请-价值特性

采购申请审批在维护价值特性时要注意是抬头价值还是行价值&#xff0c;要确定选择哪个&#xff0c;配置时对应配置。 1、创建价值特性CT04 字段名称&#xff1a;CEBAN-GSWRT&#xff0c;和CEBAN-GFWRT 抬头总价值&#xff1a;CEBAN-GFWRT&#xff1b;如果选择的是抬头审批&am…

Unity刚体

1、Dynamic&#xff1a;动态类型 受重力和力的影响移动和旋转 Material&#xff1a; 物理材质&#xff0c;在刚体上设置了物理材质&#xff0c;如果子物体有碰撞器但是没有设置材质则会通用刚体的物理材质 如果不设置&#xff0c;将使用在Physics 2D窗口中设置的默认材质(Physi…

深入解析OSI七层协议:实现网络通信的基石

目录 引言&#xff1a;详细介绍1. 物理层&#xff08;Physical Layer&#xff09;2. 数据链路层&#xff08;Data Link Layer&#xff09;3. 网络层&#xff08;Network Layer&#xff09;4. 传输层&#xff08;Transport Layer&#xff09;5. 会话层&#xff08;Session Layer…

AudioManager介绍

AudioManager介绍 AudioManager是Unity中的一个脚本类&#xff0c;用于管理游戏中的音频资源。它可以通过单例模式在整个游戏中访问&#xff0c;方便其他脚本类调用音频资源。 AudioManager方法 PlayBackgroundMusic(AudioClip clip) 播放背景音乐。 参数&#xff1a; cl…

python绘图工具matpoltlib的常用操作

目录 1.matplotlib概述2.风格设置3.条形图4.盒图5.直方图和散点图6.3D图7.pie图和布局8.Pandas与sklearn结合实例 1.matplotlib概述 Matplotlib 是一个用 Python 编程语言编写的、基于 NumPy 的开源数据可视化库。它提供了一套完整的兼容 MATLAB 的 API&#xff0c;支持各种常…

一个简单的基于C/S模型的TCP通信实例

1 TCP协议 1.1 概念 TCP是一种面向连接的、可靠的协议&#xff0c;有点像打电话&#xff0c;双方拿起电话互通身份之后就建立了连接&#xff0c;然后说话就行了&#xff0c;这边说的话那边保证听得到&#xff0c;并且是按说话的顺序听到的&#xff0c;说完话挂机断开连接。也…

数字前面填充0工具类

工具类 public class ParamUtil {//检查是否为数字private static final Pattern pattern Pattern.compile("[0-9]*");//检查是否为01-99之间的数字private static final Pattern pattern2 Pattern.compile("^([1-9]|0[1-9]|[1-9][0-9])$");//检查是否大…