eventbus和观察者是一样的,需要先导入eventbus的架包。
基本的使用步骤就是如下4步,
- 定义事件类型:
`public class MyEvent {}` - 定义事件处理方法:
`public void onEventMainThread` - 注册订阅者:
`EventBus.getDefault().register(this)` - 发送事件:
`EventBus.getDefault().post(new MyEvent())`
EventBus包含4个ThreadMode:PostThread,MainThread,BackgroundThread,Async
MainThread我们已经不陌生了;我们已经使用过。
具体的用法,极其简单,方法名为:onEventPostThread, onEventMainThread,onEventBackgroundThread,onEventAsync即可
具体什么区别呢?
onEventMainThread代表这个方法会在UI线程执行
onEventPostThread代表这个方法会在当前发布事件的线程执行
BackgroundThread这个方法,如果在非UI线程发布的事件,则直接执行,和发布在同一个线程中。如果在UI线程发布的事件,则加入后台任务队列,使用线程池一个接一个调用。
Async 加入后台任务队列,使用线程池调用,注意没有BackgroundThread中的一个接一个。
1、具体实现:
一个事件的基类
public class BaseEvent {
}
2、具体事件的类型
package com.example.mydemo;
public class FavorEvent extends BaseEvent {
private int did;
private String msg = "";
public FavorEvent() {
}
public FavorEvent(int did, String msg) {
this.did = did;
this.setMsg(msg);
}
public int getDid() {
return did;
}
public void setDid(int did) {
this.did = did;
}
public String getMsg() {
return msg;
}
public void setMsg(String msg) {
this.msg = msg;
}
@Override
public String toString() {
return "FavorEvent [did=" + did + ", msg=" + msg + "]";
}
}
3、注册eventbus事件,其中必须在写onEventPostThread, onEventMainThread,onEventBackgroundThread,onEventAsync其中一个方法,因为这是事件的回调,eventbus会自动检测是否类中存在四种方法中的其中一种。
package com.example.mydemo;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.TextView;
import de.greenrobot.event.EventBus;
public class MainActivity extends Activity {
private String TAG = "MainActivity";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
EventBus.getDefault().register(this);
findViewById(R.id.ttt).setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(MainActivity.this,
MainActivity2.class);
// TODO Auto-generated method stub
startActivity(intent);
}
});
}
public void onEventMainThread(FavorEvent event) {
Log.e(TAG, "onEventMainThread" + "event=" + event.toString());
((TextView) findViewById(R.id.ttt)).setText("发布啦");
}
@Override
protected void onDestroy() {
// TODO Auto-generated method stub
EventBus.getDefault().unregister(this);
super.onDestroy();
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
}
4、在MainActivity2类中通知类型为favorite类型的事件调用四种onEvent方法中的一种(我们已经在MainActivity类中写好了)
package com.example.mydemo;
import de.greenrobot.event.EventBus;
import android.os.Bundle;
import android.app.Activity;
import android.content.Intent;
import android.util.Log;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.TextView;
public class MainActivity2 extends Activity {
private String TAG = "MainActivity2";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main_activity2);
// EventBus.getDefault().register(this);
findViewById(R.id.rrr).setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Log.e(TAG, "onEventMainThread");//通知注册类型为FavorEvent的类调用回调 d EventBus.getDefault().post(new FavorEvent(000, "nimeia"));
}
});
}
}
点击MainActivity2中findViewById(R.id.rrr)的事件,log打印如下,说明调用成功