天天看点

关于事件总线EventBus的使用

说到事件总线,可能你还不明白,那下面我就来讲讲什么是事件线

我们经常会有这样的需求:

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;
    }
}
           
关于事件总线EventBus的使用