eventbus类似于广播,发送一个事件,在另外一个activity中接收事件,做出相应的响应,
首先需要导入eventbug包,可以选择导入jar包,也可以在gradle中加入
compile 'org.greenrobot:eventbus:3.0.0'
我导入的是3.0的eventbus包,接下来上代码,看具体的用法,
首先看下简单的一个效果
界面很简单,只有两个界面,第一个界面是一个按钮和一个显示消息的textview,
第二个界面是一个发送消息的按钮,点击发送事件,第二个界面先出发响应事件,弹出toast,然后第一个界面响应这个事件,并更新UI。
效果和广播很像,但具体的实现却非常简单,代码如下
首先是第一个界面的布局,就是一个button和一个textview
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/activity_main"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context="com.demo.swt.eventbugdemo.MainActivity">
<Button
android:id="@+id/button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="跳转到下一个界面" />
<TextView
android:id="@+id/textview"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="等待接收信息" />
</LinearLayout>
第一个界面的java页面
package com.demo.swt.eventbugdemo;
import android.content.Intent;
import android.graphics.Color;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import org.greenrobot.eventbus.EventBus;
import org.greenrobot.eventbus.Subscribe;
import org.greenrobot.eventbus.ThreadMode;
public class MainActivity extends AppCompatActivity {
private TextView textView;
private Button button;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
textView = (TextView) findViewById(R.id.textview);
button = (Button) findViewById(R.id.button);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(MainActivity.this, SecondActivity.class);
startActivity(intent);
}
});
EventBus.getDefault().register(this);//注册
}
//表示在主线程接收消息
@Subscribe(threadMode = ThreadMode.MAIN)
public void oninfoChange(MyInfoChange event) {
textView.setTextColor(Color.RED);
textView.setText("我接收到了消息");
}
@Override
protected void onDestroy() {
super.onDestroy();
EventBus.getDefault().unregister(this);//取消注册
}
}
我们一般选择在oncreate中注册eventbus,在ondestroy中取消注册,和生命周期保持同步,在代码中我们可以看到更新UI的操作,写在一个事件响应的方法中,这个方法体就是一个简单的类,MyInfoChange
package com.demo.swt.eventbugdemo;
/**
* Created by pc on 2016/11/25.
*/
public class MyInfoChange {
}
而前面的oninfoChange是我们自己定义的一个方法,可以自己命名,
第二个界面布局代码就不上了,就是一个按钮
第二个界面的java代码
package com.demo.swt.eventbugdemo;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;
import org.greenrobot.eventbus.EventBus;
import org.greenrobot.eventbus.Subscribe;
import org.greenrobot.eventbus.ThreadMode;
/**
* Created by pc on 2016/11/25.
*/
public class SecondActivity extends AppCompatActivity {
private Button mSecondButoon;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_second);
EventBus.getDefault().register(this);
mSecondButoon = (Button) findViewById(R.id.second_button);
mSecondButoon.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
EventBus.getDefault().post(new MyInfoChange());
finish();
}
});
}
//第二个界面响应事件的方法
@Subscribe(threadMode = ThreadMode.MAIN)
public void oninfoChange(MyInfoChange event) {
Toast.makeText(this,"发送_biubiu",Toast.LENGTH_LONG).show();
}
@Override
protected void onDestroy() {
super.onDestroy();
EventBus.getDefault().unregister(this);
}
}
同样是在oncrete中注册在ondestroy中取消注册,当点击按钮的时候,会发送一条事件EventBus.getDefault().post(new MyInfoChange());
同时结束掉这个activity,在post中new 出响应体,就这样,事件就发送成功了。一般eventbus发送事件,用来更新UI,比如你在下一个界面点击的操作,会对上一个界面造成影响,这个时候就可以用evenbus发送一条事件,在返回到上一个界面的时候自动刷新,而不是去手动刷新,当然还有很多的用法,这里只是举例一个很简单的用法,
PS:threadMode有四种
onEvent:如果使用onEvent作为订阅函数,那么该事件在哪个线程发布出来的,onEvent就会在这个线程中运行,也就是说发布事件和接收事件线程在同一个线程。使用这个方法时,在onEvent方法中不能执行耗时操作,如果执行耗时操作容易导致事件分发延迟。
onEventMainThread:如果使用onEventMainThread作为订阅函数,那么不论事件是在哪个线程中发布出来的,onEventMainThread都会在UI线程中执行,接收事件就会在UI线程中运行,这个在Android中是非常有用的,因为在Android中只能在UI线程中跟新UI,所以在onEvnetMainThread方法中是不能执行耗时操作的。
onEventBackground:如果使用onEventBackgrond作为订阅函数,那么如果事件是在UI线程中发布出来的,那么onEventBackground就会在子线程中运行,如果事件本来就是子线程中发布出来的,那么onEventBackground函数直接在该子线程中执行。
onEventAsync:使用这个函数作为订阅函数,那么无论事件在哪个线程发布,都会创建新的子线程在执行onEventAsync.