首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Android:快速呼叫时不触发Transformations.switchMap

Android中的Transformations.switchMap是LiveData类中的一个方法,用于在LiveData对象发生变化时,将其转换为另一个LiveData对象。

具体来说,switchMap方法接收两个参数:一个源LiveData对象和一个转换函数。当源LiveData对象发生变化时,转换函数会被调用,并返回一个新的LiveData对象。新的LiveData对象会替换之前的LiveData对象,从而实现数据的转换和更新。

在快速呼叫时不触发Transformations.switchMap的情况下,可以通过以下方式实现:

  1. 使用MediatorLiveData:MediatorLiveData是LiveData的子类,它可以监听多个LiveData对象的变化,并在变化时触发相应的操作。你可以创建一个MediatorLiveData对象,将源LiveData对象和转换函数添加到MediatorLiveData中,并在转换函数中添加条件判断,只有当不是快速呼叫时才执行转换操作。

示例代码如下:

代码语言:txt
复制
LiveData<Boolean> isQuickCallLiveData = ...; // 快速呼叫LiveData对象
LiveData<String> sourceLiveData = ...; // 源LiveData对象

MediatorLiveData<String> transformedLiveData = new MediatorLiveData<>();
transformedLiveData.addSource(sourceLiveData, value -> {
    if (!isQuickCallLiveData.getValue()) {
        // 执行转换操作
        String transformedValue = transform(value);
        transformedLiveData.setValue(transformedValue);
    }
});

// transformedLiveData即为转换后的LiveData对象
  1. 自定义LiveData:你可以创建一个自定义的LiveData类,在其中重写setValue方法,在快速呼叫时不触发转换操作。

示例代码如下:

代码语言:txt
复制
public class CustomLiveData<T> extends LiveData<T> {
    private LiveData<Boolean> isQuickCallLiveData; // 快速呼叫LiveData对象

    public void setIsQuickCallLiveData(LiveData<Boolean> isQuickCallLiveData) {
        this.isQuickCallLiveData = isQuickCallLiveData;
    }

    @Override
    public void setValue(T value) {
        if (isQuickCallLiveData == null || !isQuickCallLiveData.getValue()) {
            super.setValue(value);
        }
    }
}

// 使用自定义LiveData
CustomLiveData<String> transformedLiveData = new CustomLiveData<>();
transformedLiveData.setIsQuickCallLiveData(isQuickCallLiveData); // 设置快速呼叫LiveData对象

以上是在Android中实现快速呼叫时不触发Transformations.switchMap的两种方法。根据具体的业务需求和代码结构,你可以选择适合的方法来实现。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

双击事件(dblclick)时,不触发鼠标按下(mousedown) 动作事件

在一个dom节点的事件绑定中,如果同时绑定了dblclick和mousedown那么想要执行双击事件(dblclick)时能就会触发两次mousedown事件。...因此,触发顺序是,mousedown首先触发,mouseup接着触发,click最后触发。 dblclick事件则会在mousedown、mouseup、click之后触发。...mouseover事件和mouseenter事件,都是鼠标进入一个节点时触发。...解决的思路:要想双击时不执行单击事件,就使用定时器清除掉两个单击事件,留下一个双击事件。...要想不执行第一次的任务队列,那么定时器时间间隔就必须大于两次单击的时间间隔了。这样才能清除第一次的单击事件,所以,这个200是酌情值,大于间隔就行。

73820
  • ViewModels and LiveData- Patterns + AntiPatterns

    它也有利于快速离开主线程。在Architecture Blueprints中有一个Clean Architecture的例子。...img 如果ViewModel是轻量级的,或者操作被保证快速完成,这种泄漏就不是什么大问题。然而,情况并不总是这样的。理想情况下,只要没有任何视图在观察它们,ViewModel就应该是自由的。...Transformations.switchMap让你创建一个新的LiveData,对其他LiveData实例的变化做出反应。它还允许在整个链条上携带观察者的生命周期信息。...LiveData repo = Transformations.switchMap(repoIdLiveData, repoId -> { if (repoId.isEmpty...return AbsentLiveData.create(); } return repository.loadRepo(repoId); } ); 在这个例子中,当触发器得到更新时

    1.1K30

    Android从零开始搭建MVVM架构(4)——LiveData

    LiveData 介绍 Livedata 是 Google 推荐的 Android 架构组件之一,是一个存放可被观察的数据持有类,有生命周期感知功能,解决了android开发者需要去手动处理生命周期的痛点...当你更新LiveData对象中存储的数据时,所有注册了的Observer,只要所绑定的LifecycleOwner处于活动状态,就会被触发通知。...这样做表示此Observer绑定了Lifecycle对象的生命周期,即: 1.如果Lifecycle对象不处于活动状态,则即使值发生更改,也不会调用Observer。...另外,如果UI组件被重新创建,它会触发对repository.getPostCode()方法的另一个调用,而不是使用前一个调用的结果。   ...在任何原始LiveData源对象改变后,MediatorLiveData对象的Observer会被触发。

    2.4K30

    详解WebRTC——网页实时通信技术

    缺点 传输质量难以保证,比如跨地区、跨运营商、低带宽、高丢包、P2P连接率、呼叫成功率。 设备端适配,如回声、录音失败等问题层出不穷。这一点在安卓设备上尤为突出。...send data channel'); //绑定onopen、onclose、onicecandidate(当RTCPeerConnection被createPeerConnection()成功创建时触发...function(e) { onIceCandidate(remoteConnection, e); }; //当一个RTC数据通道已被远端调用createDataChannel()添加到连接中时触发...Callback'); receiveChannel = event.channel; receiveChannel.binaryType = 'arraybuffer'; //接收到数据时触发...,这里不建议每次发送后设置Timeout,这样会降低吞吐量 while (sendProgress.value < sendProgress.max) { if (sendChannel.bufferedAmount

    3.6K80

    详解WebRTC-网页实时通信技术

    缺点 1.传输质量难以保证,比如跨地区、跨运营商、低带宽、高丢包、P2P连接率、呼叫成功率。 2.设备端适配,如回声、录音失败等问题层出不穷。这一点在安卓设备上尤为突出。...该Demo不需要servers,因为呼叫方(发送数据)和呼叫应答方(接收数据)在同一页面上,这样能够清晰的了解RTCPeerConnection API的原理,页面上的RTCPeerConnection...send data channel');  //绑定onopen、onclose、onicecandidate(当RTCPeerConnection被createPeerConnection()成功创建时触发...function(e) {    onIceCandidate(remoteConnection, e);  };  //当一个RTC数据通道已被远端调用createDataChannel()添加到连接中时触发...Channel Callback');  receiveChannel = event.channel;  receiveChannel.binaryType = 'arraybuffer';  //接收到数据时触发

    3.2K30

    Android Jetpack - LiveData

    LiveData 自动管理所有这些,因为它在观察时意识到相关的生命周期状态变化 始终保持数据最新 如果生命周期变为非活动状态,它将在再次变为活动状态时接收最新数据。...具体可以参考 Android Jetpack - Room 一文所提供的代码示例 转换 LiveData 您可能希望在将 LiveData 对象分派给观察者之前更改存储在 LiveData 对象中的值,...Popularity.NORMAL } } } enum class Popularity { NORMAL, // 普通 POPULAR, // 受欢迎 STAR // 巨星 } Transformations.switchMap...private fun getUser(id: String): LiveData { ... } val userId: LiveData = ... val user = Transformations.switchMap...userId) { id -> getUser(id) } 完整代码示例 https://github.com/realskyrin/jetpack_livedata 参考 https://developer.android.com

    2K30

    推荐⼀款超好⽤的UI⾃动化⼯具: UiAutomator2!

    1、 导读 做过Android自动化测试的同学想必都知道,最开始用的UiAutomator是Google提供的⽤来做安卓⾃动化测试的⼀个Java库,基于Accessibility服务,功能强⼤,但仅...快速开始: 先准备一台开启了开发者选项的安卓手机,连接上电脑,确保执行adb devices可以看到连接上的设备。...import uiautomator2 as u2 d = u2.connect() # connect to device print(d.info) 3、UiAutomator2 特色功能 在Android...4、案例模拟 本案例,假设自动模拟打电话、挂电话操作,如果是使用d.watchers.watched = True,可以先执行脚本,再进行呼叫。...watchers print("Watchers:", d.watchers) 也可以将启动方式改成d.watchers.run()如果是使用d.watchers.run(),则需要在电话已经处于呼叫的过程中

    87310

    Android 面试题:为什么 Activity 都重建了 ViewModel 还存在?—— Jetpack 系列(3)

    本文已收录到 GitHub · Android-NoteBook[1] 中。...r.lastNonConfigurationInstances = null; ... } 2.5 ViewModel 的数据在什么时候才会清除 ViewModel 的数据会在 Activity 非配置变更触发的销毁时清除...而前 2 种情况都属于非配置变更触发的,在 Activity 中存在 1 个 Lifecycle 监听:当 Activity 进入 DESTROYED 状态时,如果 Activity 不处于配置变更重建的阶段...如果 ViewModel 是轻量级的或者可以保证数据层操作快速完成,这个泄漏影响不大可以忽略。但如果数据层操作并不能快速完成,或者 ViewModel 存储了重量级数据,就有必要采取措施。...[16] —— 官方博文 参考资料 [1] GitHub · Android-NoteBook: https://github.com/pengxurui/Android-NoteBook [2] 3、

    1.2K20
    领券