EventBus

EventBus

事件总线,用于在不同组件之间传递信息。
传递信息的方式有很多种,但都有各自的优缺点,在简单的Activity间传递信息还是使用intent。

EventBus传递消息的步骤:
  1.定义一个事件实体类;
  2.在目标页面注册订阅事件,并编写事件处理方法(方法必须使用@Subscribe注解,public修饰,有且只有一个参数);
  3.在需要发布事件的地方进行发布。

Demo示例:

1.事件实体类
Event.java

package com.eos.eventbus;

public class Event {

    private String msg;

    public Event(String msg) {
        this.msg = msg;
    }

    public String getMsg() {
        return msg;
    }

    public void setMsg(String msg) {
        this.msg = msg;
    }
}

注:事件类名随意。

2.事件订阅者
MainActivity.java

package com.eos.eventbus;

import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import androidx.appcompat.app.AppCompatActivity;
import org.greenrobot.eventbus.EventBus;
import org.greenrobot.eventbus.Subscribe;
import org.greenrobot.eventbus.ThreadMode;

public class MainActivity extends AppCompatActivity {

    private static final String TAG = MainActivity.class.getSimpleName();
    private TextView text1;
    Button button1;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        // 注册订阅者
        EventBus.getDefault().register(this);
        button1 = findViewById(R.id.button1);
        text1 = findViewById(R.id.text1);
        button1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent(MainActivity.this,ReceiveActivity.class);
                startActivity(intent);
            }
        });
    }

    //如何处理事件
    @Subscribe(threadMode = ThreadMode.MAIN)
    public void onMessageEvent(Event event) {
        Log.i(TAG, "message is " + event.getMsg());
        // 更新界面
        text1.setText(event.getMsg());
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        // 注销订阅者
        EventBus.getDefault().unregister(this);
    }
}

注:处理事件的方法名随意,注意加上注解。

avtivity_main.xml


<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <TextView
        android:id="@+id/text1"
        android:layout_width="match_parent"
        android:layout_height="100dp"
        android:gravity="center"
        android:text="主界面" />

    <Button
        android:id="@+id/button1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="打开" />

LinearLayout>

3.事件发布者
PostActivity.java

package com.eos.eventbus;

import androidx.appcompat.app.AppCompatActivity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;

import org.greenrobot.eventbus.EventBus;

public class PostActivity extends AppCompatActivity {

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

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_post);
        findViewById(R.id.button2).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                EventBus.getDefault().post(new Event("你好!"));
                Intent intent = new Intent(PostActivity.this,MainActivity.class);
                startActivity(intent);
            }
        });
    }
}

activity_post.xml


<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:gravity="center"
    android:orientation="horizontal">

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

LinearLayout>

在这个小demo中,MainActivity为事件订阅者,PostActivity为事件发送者。

你可能感兴趣的:(安卓,android,java)