说到事件总线,可能你还不明白,那下面我就来讲讲什么是事件线
我们经常会有这样的需求:
1 从一个页面跳转到下一个页面,需要将一些数据传递给下一个页面
2 我们在第二个页面进行设置(activity)比如夜间模式,换背景等
3 在第一个页面发送广播,在第N个页面处理
对于上面的需求,我们本来是可以解决的,比如第一个 我们可以使用itent 来进行数据传输(对象模型要实现序列化),比如第2,3个 我们可以使用广播来处理,或者使用接口回调来处理(这样的话,会提高编程的难度,使用起来也不方便)
上面一个页面发生的事件要传递到上一个界面,或者别的界面 就构成了一条事件线
今天介绍EventBus 这个开源框架
原理
EventBus的一个单例内部维持着一个map对象,里面存储了一堆方法,而发送事件方法post 就是根据参数去查找方法,然后进行反射调用。
在post里面有四个case:MainThread,BackgroundThead,Async,PostThread四种应用场景,分别表示该方法运行在主线程,后台线程(子线程,一个一个有序执行),后台线程(子线程,动态并发执行),和发布事件同一个线程
开始
添加依赖或者jar
https://github.com/greenrobot/EventBus
使用方法
参考文章如下:
http://blog.csdn.net/lmj623565791/article/details/40794879
http://blog.csdn.net/harvic880925/article/details/40660137
有一个简单的栗子 ,界面跳转传递消息
布局文件代码就不贴了,比较简单
import com.harvic.other.FirstEvent;
import de.greenrobot.event.EventBus;
import android.app.Activity;
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 android.widget.Toast;
public class MainActivity extends Activity {
Button btn;
TextView tv;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
EventBus.getDefault().register(this);
btn = (Button) findViewById(R.id.btn_try);
tv = (TextView)findViewById(R.id.tv);
btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
Intent intent = new Intent(getApplicationContext(),
SecondActivity.class);
startActivity(intent);
}
});
}
public void onEventMainThread(FirstEvent event) {
String msg = "onEventMainThread收到了消息:" + event.getMsg();
Log.d("harvic", msg);
tv.setText(msg);
Toast.makeText(this, msg, Toast.LENGTH_LONG).show();
}
@Override
protected void onDestroy(){
super.onDestroy();
EventBus.getDefault().unregister(this);
}
}
第二个页面
public class SecondActivity extends Activity {
private Button btn_FirstEvent;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_second);
btn_FirstEvent = (Button) findViewById(R.id.btn_first_event);
btn_FirstEvent.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
EventBus.getDefault().post(
new FirstEvent("FirstEvent btn clicked"));
}
});
}
}
下面是事件模型类
public class FirstEvent {
private String mMsg;
public FirstEvent(String msg) {
// TODO Auto-generated constructor stub
mMsg = msg;
}
public String getMsg(){
return mMsg;
}
}