首页 > 其他分享 >使用EventBus在Activity和fragment之间传递数据,出现post一次,却接收到多次对应事件

使用EventBus在Activity和fragment之间传递数据,出现post一次,却接收到多次对应事件

时间:2024-06-21 10:55:02浏览次数:19  
标签:fragment Activity getDefault activity 传递数据 post 接收 EventBus

背景

项目中有一个activity,其中通过viewpager管理着多个页面,在activity操作某些数据时,通过eventbus将消息传递给fragment。

该fragment中,分别在onViewCreated注册了eventbus

if (!EventBus.getDefault().isRegistered(this)) {
EventBus.getDefault().register(this);
}

在onDestroyView中解注册了eventbus

if (EventBus.getDefault().isRegistered(this)) {
EventBus.getDefault().unregister(this);
}

出现状况:当我在activity中post了一次数据,在该fragment中实际接收到了两次,且间隔时间极短

 因为收到个消息后,fragment会根据当前fragment的view中各按钮的状态(比如单选框)来确定下发的接口参数,我通过日志发现,收到两次event消息后实际发出的接口参数还不一样,也就是说fragment的view状态其实是不一样的。

第二次发出的接口参数才是用户的真实意图,即第二次拿到的按钮状态才是正确的.

其它信息:

该activity管理4个fragment,而接收消息的fragment处于第2个,而且只有接收消息fragment可见时,activity的按钮才会展示(点击该按钮才会通过eventbus post对应事件)

该activity的viewpager设置了setOffscreenPageLimit(2),按理说这个值没影响,本来该fragment已经可见了,不存在预加载问题。

这个问题是偶现的

 

修改:

目前没有找到确切原因,但从刚才分析结果来看,两次接收到消息的时差在0.02s,在这极短时间内获取fragment的view状态其实是不一致的,如果我们在post时做一个延时(比如200ms),即使一次post出去后fragment接收到两次,此时fragment的状态也应该一致了,最多就下发两次相同值的接口数据。后面有思路再优化,欢迎讨论

 

 

 


标签:fragment,Activity,getDefault,activity,传递数据,post,接收,EventBus
From: https://www.cnblogs.com/terrorists/p/18260044

相关文章

  • fragment2
    packagecom.example.dataapplication.fragment.frag2;importandroid.os.Bundle;importandroidx.annotation.NonNull;importandroidx.annotation.Nullable;importandroidx.fragment.app.Fragment;importandroidx.recyclerview.widget.LinearLayoutManager;import......
  • Fragment
    Fragment可以做到把屏幕划分成几块,然后进行分组,进行模块化的管理。并且可以更加方便的在运行过程中动态地更新Activity的用户界面Fragment并不能单独使用,他需要嵌套在Activity中使用,尽管他拥有自己的生命周期,但是还是会受到宿主Activity的生命周期的影响,比如Activity被destor......
  • Fragment的动态创建
    Fragment的动态创建动态创建不同于静态创建,不需要写固定的xml文件,但是依然要有一个xml文件来当容器。1.我们需要使用<androidx.fragment.app.FragmentContainerView/><?xmlversion="1.0"encoding="utf-8"?><LinearLayoutxmlns:android="http://schemas.android.com/apk/re......
  • Activity和fragment是如何交互的
    Fragment是Android中历史十分悠久的一个组件,在Android3.0(API级别11)的时候推出,时至今日已成为Android开发中最常用的组件之一在一开始的时候,引入Fragment的目的是为了在大屏幕(如平板电脑)上能够更加动态和灵活地设计界面,被定义为一个**轻量级Activity**而进行设计......
  • 冲刺06fragment_reg_chi_fil_inf.xml
    <?xmlversion="1.0"encoding="utf-8"?><FrameLayoutxmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent&......
  • etcd错误:Failed to defragment etcd member[127.0.0.1:2379] (context deadline excee
    etcd版本#etcdctlversionetcdctlversion:3.5.1APIversion:3.5问题在执行etcdctl--endpoints=http://127.0.0.1:2379defrag命令时,可能遇到错误:{"level":"warn","ts":"2024-06-12T18:20:17.444+0800","logger":"et......
  • mybatis的mapper中的sql涉及嵌套且外部引用导致的问题:XML fragments parsed from prev
    假设xxx.xml中有类似下方的sql嵌套:<?xmlversion="1.0"encoding="UTF-8"?><!DOCTYPEmapperPUBLIC"-//mybatis.org//DTDMapper3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd"><mappernamespace="com.xx......
  • Activity活动详简总结
    简介        活动(Activity是一种可以包含用户界面的组件主要用于和用户进行交互。一、创建项目NewProject    选择NoActivity,创建一个空活动:     语言选择Java,点击Finish,等待工程加载二、MainActivity活动类   找到如下图路径: ......
  • Prism之EventAggregator——实现ViewModel之间传递数据的工作
    publicclassMessageViewModel:BindableBase{IEventAggregator_ea;privatestring_message="MessagetoSend";publicstringMessage{get{return_message;}set{SetProperty(ref_message,value);}}......
  • finishActivity (int requestCode)
    publicvoidfinishActivity(intrequestCode)Since:APILevel1ForcefinishanotheractivitythatyouhadpreviouslystartedwithstartActivityForResult(Intent,int).ParametersrequestCodeTherequestcodeoftheactivitythatyouhadgiventostartActivit......