EventBus的介绍和使用

EventBus的介绍

EventBus是一种用于Android的事件发布-订阅总线

作用

它简化了应用程序内各个组件之间进行通信的复杂度,尤其是碎片之间进行通信的问题,可以避免由于使用广播通信而带来的诸多不便。

引入

implementation ‘org.greenrobot:eventbus:3.2.0’
最新版本可以去官网查看

成员

1.发送者
用来在任意线程中,发送数据,参数是Objcet类型.

  java EventBus.getDefault().post(Object o);

2.接收者
用来接收数据.但是接收之前需要在当前的页面注册和注销,方法如下:

 @Override
public void onStart() {
super.onStart();
EventBus.getDefault().register(this);
}

@Override
public void onStop() {
super.onStop();
EventBus.getDefault().unregister(this);
}

3.事件
可以简单的理解为,需要发送的消息内容,建议封装成一个对象.

public class MessageEvent { /* Additional fields if needed */ }

这里需要注意一个问题:
就是接收者虽然通过注册方式注册成功了,但是还需要一个方法用来接收发送者传来的数据: 方法如下:

 /**
 * 方法名称随意.
 * @param s 发送的参数是什么,接收的参数就是什么.
 */
@Subscribe
public void getMsg(String s){
    fgText.setText(s);
}

综合小案例

到此,EventBus已经可以简单实用了,我们在做一个如下的案例.
要求,在一个Activity中,有一个输入框,一个button,一个fragment
,我们用EventBus 来显示 Activity给fragment传值.
布局和要求如下:
在这里插入图片描述

Activity中的布局

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:orientation="vertical"
android:layout_height="match_parent"
tools:context=".BusActivity">

<EditText
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:id="@+id/edit"
    android:hint="输入点啥吧"></EditText>

<Button
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:id="@+id/sendContent"
    android:text="发送"></Button>

<fragment
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:id="@+id/fg"
    android:name="com.fenghongzhang.day012.BlankFragment">
</fragment>
</LinearLayout>

Activity中的代码:

package com.fenghongzhang.day012;

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;

import org.greenrobot.eventbus.EventBus;

public class BusActivity extends AppCompatActivity {
private EditText edit;
private Button sendContent;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_bus);
    edit = (EditText) findViewById(R.id.edit);
    sendContent = (Button) findViewById(R.id.sendContent);

    sendContent.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            String s = edit.getText().toString();
            EventBus.getDefault().post(s);
        }
    });
}
}

fragment中的代码:

package com.fenghongzhang.day012;


import android.os.Bundle;

import androidx.annotation.Nullable;
import androidx.fragment.app.Fragment;

import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;

import org.greenrobot.eventbus.EventBus;
import org.greenrobot.eventbus.Subscribe;


/**
 * A simple {@link Fragment} subclass.
 */
public class BlankFragment extends Fragment {
private TextView fgText;
public BlankFragment() {
    // Required empty public constructor
}
//    @Override
//    public void onCreate(@Nullable Bundle savedInstanceState) {
//        super.onCreate(savedInstanceState);
//        EventBus.getDefault().register(this);
//    }


@Override
public void onStart() {
    super.onStart();
    EventBus.getDefault().register(this);
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    View inflate = inflater.inflate(R.layout.fragment_blank, container, false);
    fgText = (TextView) inflate.findViewById(R.id.fg_text);

//        fgText.setText(?);
    return inflate;
}
/**
 * 方法名称随意.
 * @param s 发送的参数是什么,接收的参数就是什么.
 */
@Subscribe
public void getMsg(String s){
    fgText.setText(s);
}
@Override
public void onStop() {
    super.onStop();
    EventBus.getDefault().unregister(this);
}
}

fragment中的布局只有一个textView 不放代码了.

线程模型

EventBus3.0有四种线程模型,分别是:

1, POSTING: 默认,表示事件处理函数的线程跟发布事件的线程在同一个线程。

2, MAIN: 表示事件处理函数的线程在主线程(UI)线程,因此在这里不能进行耗时操作。

3, BACKGROUND: 表示事件处理函数的线程在后台线程,因此不能进行UI操作。如果发布事件的线程是主线程(UI线程),那么事件处理函数将会开启一个后台线程,如果果发布事件的线程是在后台线程,那么事件处理函数就使用该线程。

4, ASYNC: 表示无论事件发布的线程是哪一个,事件处理函数始终会新建一个子线程运行,同样不能进行UI操作

线程模型的用处:

因为发送者是可以在任意线程中发送数据的,那么相对的接收者也是可以在任意线程中接收数据,
因为涉及到更新ui或耗时操作的问题,所以要给接收者指定在什么线程中接收.
代码如下:

/**
 * 方法名称随意.-
 * @param s 发送的参数是什么,接收的参数就是什么.
 */
 //默认的线程模型
@Subscribe
public void getMsg(String s){
    fgText.setText(s);
}
//不是发送者是什么线程,我接收者都是在 主 线程中.
@Subscribe(threadMode = ThreadMode.MAIN)
public void getMsg(String s){
    fgText.setText(s);
}
//不是发送者是什么线程,我接收者都是在 子 线程中.
@Subscribe(threadMode = ThreadMode.BACKGROUND)
public void getMsg(String s){
    fgText.setText(s);
}

官方网址:

https://github.com/greenrobot/EventBus

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值