栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Android开发 SingleLiveData解决LiveData或者MutableLiveData多次回调的问题

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Android开发 SingleLiveData解决LiveData或者MutableLiveData多次回调的问题

请仔细阅读前言

前言
主要是为了解决Fragment初次创建会执行生命周期的onViewCreated方法,会注册一次(在onViewCreated方法进行注册,
注册方法是viewModel!!.getDataxSuccess().observe(this, dataxSuccessObserver!!),具体看我的项目),跳到别的Fragment或者Activity,再返回当前Fragment时,又会执行生命周期的onViewCreated方法,然后再注册一次(在onViewCreated方法进行注册,viewModel!!.getDataxSuccess().observe(this, dataxSuccessObserver!!),具体看我的项目),所以在这种情况下,普通的MutableLiveData会注册多次后,会回调两次数据(按说会回调多次,但是实际上只回调两次,具体原因请查看https://blog.csdn.net/vivo_tech/article/details/122553764),我们其实只需要回调一次数据就可以了,回调两次,会消耗手机性能,用这个SingleLiveData来写,SingleLiveData注册多次,
只会回调一次数据,正好符合我们的需要。
感受:一开始我也没注意到这种情况,还以为MutableLiveData注册多次
(注册方法是viewModel!!.getDataxSuccess().observe(this, dataxSuccessObserver!!),具体看我的项目),只回调一次,现实是MutableLiveData注册多次,按说会回调多次,但是实际上只回调两次(Android真是坑多,我也是服了,不知道设计人员为什么这么设计,真无语。。。)

解决方案

就是使用一个google大神实现的一个复写类SingleLiveData,其中的机制是用一个原子 AtomicBoolean记录一次setValue。在发送一次后在将AtomicBoolean设置为false,阻止后续前台重新触发时的数据发送。

package com.phone.common_library.manager;

import android.util.Log;

import androidx.annotation.MainThread;
import androidx.annotation.Nullable;
import androidx.lifecycle.LifecycleOwner;
import androidx.lifecycle.MutableLiveData;
import androidx.lifecycle.Observer;

import java.util.concurrent.atomic.AtomicBoolean;


public class SingleLiveData extends MutableLiveData {

    private static final String TAG = SingleLiveData.class.getSimpleName();

    private final AtomicBoolean mPending = new AtomicBoolean(false);

    @MainThread
    public void observe(LifecycleOwner owner, final Observer observer) {

        if (hasActiveObservers()) {
            Log.w(TAG, "Multiple observers registered but only one will be notified of changes.");
        }

        // Observe the internal MutableLiveData
        super.observe(owner, new Observer() {
            @Override
            public void onChanged(@Nullable T t) {
                if (mPending.compareAndSet(true, false)) {
                    observer.onChanged(t);
                }
            }
        });
    }

    @MainThread
    public void setValue(@Nullable T t) {
        mPending.set(true);
        super.setValue(t);
    }

    
    @MainThread
    public void call() {
        setValue(null);
    }
}

如对此有疑问,请联系qq1164688204。

推荐Android开源项目

项目功能介绍:RxJava2和Retrofit2项目,添加自动管理token功能,添加RxJava2生命周期管理,使用App架构设计是MVP模式和MVVM模式,同时使用组件化,部分代码使用Kotlin,此项目持续维护中。

项目地址:https://gitee.com/urasaki/RxJava2AndRetrofit2

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/885959.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号