简单使用EventBus的几个步骤。
首先把这个添加到你的工程上去: compile ‘org.greenrobot:eventbus:3.0.0’
添加完后,就rebuild下,
我们就实现个SecondActivity更改MainActivity修改textview的值
1,定义一个类 MessageEvent.java
public class MessageEvent {
private String message;
public MessageEvent(String message) {
this.message = message;
}
public void setMessage(String message) {
this.message = message;
}
public String getMessage() {
return message;
}
}
2 , MainActivity代码如下:
public class MainActivity extends AppCompatActivity {
private TextView mTv;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
EventBus.getDefault().register(this);//为该Activity注册该事件
mTv = (TextView) findViewById(R.id.tv);//初始化mTv
}
@Subscribe
public void updateTextViewValue(MessageEvent message) {
mTv.setText(message.getMessage());
Toast.makeText(this, "修改成功", Toast.LENGTH_SHORT).show();
}
/**
* 绑定按钮点击事件
*
* @param view
*/
public void onclick(View view) {
Intent intent = new Intent(this, SecondActivity.class);
startActivity(intent);//跳到第二个Activity
}
@Override
protected void onDestroy() {
super.onDestroy();
EventBus.getDefault().unregister(this);//取消注册
}
}
3 , SecondActivity代码:
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import org.greenrobot.eventbus.EventBus;
public class SecondActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_second);
}
/**
* 绑定按钮点击事件
* @param view
*/
public void onclick(View view) {
EventBus.getDefault().post(new MessageEvent("这是来自secondActivity的消息"));
}
}
演示效果:
好了就是这么简单的使用,这个是根据参数类型调用的。
我们那注解是可以带参数的,有threadMode(线程模式),priority(优先级)
修改后的MainActivity:
import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.TextView;
import android.widget.Toast;
import org.greenrobot.eventbus.EventBus;
import org.greenrobot.eventbus.Subscribe;
public class MainActivity extends AppCompatActivity {
private TextView mTv;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
EventBus.getDefault().register(this);//为该Activity注册该事件
mTv = (TextView) findViewById(R.id.tv);//初始化mTv
}
@Subscribe(priority = 1)
public void updateTextViewValue(MessageEvent message) {
mTv.setText(message.getMessage());
Toast.makeText(this, "修改成功", Toast.LENGTH_SHORT).show();
}
@Subscribe(priority = 2)
public void getValue1(MessageEvent message){
Log.i("TAG", "priority = 2 "+message.getMessage());
}
@Subscribe(priority = 3)
public void getValue2(MessageEvent message){
Log.i("TAG", "priority = 3 "+message.getMessage());
}
@Subscribe(priority = 4)
public void getValue3(MessageEvent message){
Log.i("TAG", "priority = 4 "+message.getMessage());
}
/**
* 绑定按钮点击事件
*
* @param view
*/
public void onclick(View view) {
Intent intent = new Intent(this, SecondActivity.class);
startActivity(intent);//跳到第二个Activity
}
@Override
protected void onDestroy() {
super.onDestroy();
EventBus.getDefault().unregister(this);//取消注册
}
}
运行结果如下:
可以看到,优先级高的先接收到。优先级默认是0,
我们再了解下,threadMode(线程模式)
PostThread 默认实现,执行发生在同一个线程
MainThread 执行在UI 线程上
BackgroundThread 回调发生在非 UI 线程上
Async 永远执行在一个其他的线程上
修改后的MainActivity:
import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.TextView;
import android.widget.Toast;
import org.greenrobot.eventbus.EventBus;
import org.greenrobot.eventbus.Subscribe;
public class MainActivity extends AppCompatActivity {
private TextView mTv;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
EventBus.getDefault().register(this);//为该Activity注册该事件
mTv = (TextView) findViewById(R.id.tv);//初始化mTv
}
@Subscribe
public void updateTextViewValue(MessageEvent message) {
Log.i("TAG", "updateTextViewValue: "+Thread.currentThread().getName()+"线程id"+Thread.currentThread().getId());
mTv.setText(message.getMessage());
Toast.makeText(this, "修改成功", Toast.LENGTH_SHORT).show();
}
/**
* 绑定按钮点击事件
*
* @param view
*/
public void onclick(View view) {
Log.i("TAG", "onclick: "+Thread.currentThread().getName()+"线程id"+Thread.currentThread().getId());
EventBus.getDefault().post(new MessageEvent(""));
// Intent intent = new Intent(this, SecondActivity.class);
// startActivity(intent);//跳到第二个Activity
}
@Override
protected void onDestroy() {
super.onDestroy();
EventBus.getDefault().unregister(this);//取消注册
}
}
运行结果:
可以看到都是运行在主线程。默认的是PostThread,
在 updateTextViewValue方法注解上加上这个@Subscribe(threadMode = ThreadMode.BACKGROUND)
运行结果:
可以看到在改了后,就运行在子线程中了,并且也报了个错误
知道为什么出错吗,因为子线程不能更改ui。。哈哈
总结:
其他的情况就不演示了,这个框架挺好用的,有了这个框架我们就可以不用intent来传递数据,通过handle来更改ui,用广播发送消息,这些东西完全可以用EventBus来代替。最后给上该框架在github上的地址
https://github.com/greenrobot/EventBus