EventBus 了解及应用

来源:互联网 发布:淘宝退款可以申请几次 编辑:程序博客网 时间:2024/06/13 17:00

     标题:学习任务

EventBus是一款针对Android优化的发布/订阅事件总线。主要功能是替代Intent,Handler,BroadCast在Fragment,Activity,Service,线程之间传递消息.优点是开销小,代码更优雅。以及将发送者和接收者解耦。

     1.今天呢主要是定了一个学习任务,学习这个EventBus,也是查看一些相关的博客

具体参考了:http://blog.csdn.net/harvic880925/article/details/40660137

下载了相关的Moudle 然后到了下代码

    具体的实现效果:  也是别人的图  效果也是这样

至于导完后并不能运行,提示加一个注解@Subscribe在接收信息的方法上



     

         2.大致明白了EventBus 类似于Intent 传值.

     Intent通过跳转时,intent.put跳转到第二个Activitiy,在第二个Activity中 通过getIntent().getxxx来进行Activity之间的数据交流.而EventBus则是通过一个post方法来使其他注册过EventBus的类来得到数据.相对来说,EventBus的结构更方便于数据的传递,因为他的post方法传递的是一个对象(一个Javaben),我们可以根据需求去定义这个JavaBean的成员变量,可以放集合,基本数据类型等.而在数据的传递之间可以通过简单的set,get方法来进行.简化了数据传递的逻辑.并且接收消息的这个在onCreate()方法之前调用

   3.相对于参照博客的Demo,因为他是先跳转到第二个Activity,然后在返回到第一个Activity实现效果,本着方便于以后开发的想法,尝试做了一个Demo,想要的结果是:从第一个Activity跳转到第二个Activity时,直接接收到消息展示.

于是遇到了


翻译过来

D / EventBus:没有用户注册com.example.anadministrator.eventbus2.EventMessage事件类
D / EventBus:没有用户注册org.greenrobot.eventbus.NoSubscriberEvent事件类

于是搜了一些博客

使用粘性事件可以解决这个问题.

之前的发送方法是post,改为postSticky(),在注册了EventBus的类中接收信息的方法上,注解后面再加一句@Subcribe (Sticky=true),这个Sticky表示粘性事件的一个标识,默认是为false的,在这个改为true.只有标识为true的方法才会接收粘性事件.即接收PostSticky()方法发出的消息.


特点:

1.可以设置接收事件的优先级.

threadMode就是我们操作数据时的线程类型,这里一共有4个类型,分别是POSTING、MAIN、BACKGROUND和ASYNC.也可以使用priority=1-10来设置优先级

POSTING:

这个类型是和发布事件的一方处于同一个线程内不论是主线程还是子线程,所以这里需要注意,避免在主线程中进行耗时的操作。

MAIN:

这个类型是运行在主线程,可以进行一些子线程更新UI的操作,同样注意需要避免做一些耗时的操作。

BACKGROUND:

这个类型是运行在子线程,如果发布方是子线程,就直接在发布方的线程中执行操作,如果是主线程,就会重新开辟一个子线程,进行操作,同样避免做一些耗时操作。

ASYNC:

这个类型是异步操作,可以进行一些耗时的操作。


2.可以反注册  即释放资源   优化资源至关重要


注意:Event只是线程间的通信,并不能进行进程间的通信.


导入的依赖都是eventbus:3.0

Studio直接搜即可

代码


效果1:即上面的Gif效果

MainAcivity

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);                }            });        }        @Subscribe        public void aa(EventBusMessage event) {            String msg = "aa" + event.getMessage();            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 EventBusMessage {    //定义了发送类型    public String Message;    //有参构造    public EventBusMessage(String message) {        Message = message;    }    //写一个GET方法    public String getMessage() {        return Message;    }}
SecondActivity
public class SecondActivity extends AppCompatActivity {    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 EventBusMessage("FirstEvent btn clicked"));            }        });    }}

MainXML
<?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:layout_width="match_parent"              android:layout_height="match_parent"              android:orientation="vertical">    <Button        android:id="@+id/btn_try"        android:layout_width="match_parent"        android:layout_height="wrap_content"        android:text="btn_bty"/>    <TextView        android:id="@+id/tv"        android:layout_width="wrap_content"        android:layout_height="match_parent"/></LinearLayout>
activity_second.xml
<?xml version="1.0" encoding="utf-8"?><RelativeLayout    xmlns:android="http://schemas.android.com/apk/res/android"    xmlns:tools="http://schemas.android.com/tools"    android:id="@+id/activity_second"    android:layout_width="match_parent"    android:layout_height="match_parent"    android:paddingBottom="@dimen/activity_vertical_margin"    android:paddingLeft="@dimen/activity_horizontal_margin"    android:paddingRight="@dimen/activity_horizontal_margin"    android:paddingTop="@dimen/activity_vertical_margin"    tools:context="com.example.anadministrator.eventbus.SecondActivity">    <Button        android:id="@+id/btn_first_event"        android:layout_width="match_parent"        android:layout_height="wrap_content"        android:text="First Event"/></RelativeLayout>





/////////////////////////////////
接下来是粘性事件的代码



效果:第一个Activity发消息,点击跳转到第二个Activity接收到消息并吐司
//EventBus消息类,一个容器,负责存放一些数据,方便另一个订阅者(接受者),获取消息

MainActivity

public class MainActivity extends AppCompatActivity implements View.OnClickListener {    /**     * btn_bty     */    private Button butJump;    /**     * btn_bty     */    private Button mBtnTry;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        initView();    }    private void initView() {        butJump = (Button) findViewById(R.id.butJump);        butJump.setOnClickListener(this);        mBtnTry = (Button) findViewById(R.id.butSend);        mBtnTry.setOnClickListener(this);    }    @Override    public void onClick(View v) {        switch (v.getId()) {            case R.id.butJump:                startActivity(new Intent(MainActivity.this, Main2Activity.class));                break;            case R.id.butSend:                List<String> list=new ArrayList<>();                for (int i = 0; i < 10; i++) {                    list.add("自定义数据"+i);                }                EventMessage message = new EventMessage("发消息到Main2");                message.setList(list);                EventBus.getDefault().postSticky(message);                break;        }    }    @Override    protected void onDestroy() {        super.onDestroy();    }}
Main2Activity
public class Main2Activity extends AppCompatActivity implements View.OnClickListener {    /**     * 收到的消息:     */    private TextView mTv;    /**     * 跳转到第三个Activity     */    private Button mButTo3;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main2);        initView();        EventBus.getDefault().register(this);        System.out.println("onCreate");    }    @Override    protected void onStart() {        super.onStart();        System.out.println("onStart");    }    @Subscribe(sticky = true)    public void onEventMainThread(EventMessage event) {        System.out.println("onEventMainThread");        String msg = "onEventMainThread收到了消息:" + event.getMessage();        List<String> list = event.getList();        mTv.setText("收到的消息:"+list.get(5));        Toast.makeText(this, msg, Toast.LENGTH_LONG).show();    }    private void initView() {        mTv = (TextView) findViewById(R.id.tv);        mButTo3 = (Button) findViewById(R.id.butTo3);        mButTo3.setOnClickListener(this);    }    @Override    protected void onDestroy() {        super.onDestroy();        EventBus.getDefault().removeAllStickyEvents();        EventBus.getDefault().unregister(this);    }    @Override    public void onClick(View v) {        switch (v.getId()) {            case R.id.butTo3:                startActivity(new Intent(Main2Activity.this,Main3Activity.class));                break;        }    }}
Main3Activity
public class Main3Activity extends AppCompatActivity {    /**     * 收到的消息:     */    private TextView mTv;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main3);        initView();        EventBus.getDefault().register(this);        System.out.println("onCreate");    }    @Override    protected void onStart() {        super.onStart();        System.out.println("onStart");    }    @Subscribe(sticky = true)    public void onEventMainThread(EventMessage event) {        System.out.println("onEventMainThread");        String msg = "onEventMainThread收到了消息:" + event.getMessage();        mTv.setText("收到的消息:"+event.getList().get(5));        Toast.makeText(this, msg, Toast.LENGTH_LONG).show();    }    private void initView() {        mTv = (TextView) findViewById(R.id.tv3);    }    @Override    protected void onDestroy(){        super.onDestroy();        EventBus.getDefault().removeAllStickyEvents();        EventBus.getDefault().unregister(this);    }}
 

MainXML

<?xml version="1.0" encoding="utf-8"?><RelativeLayout    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:paddingBottom="@dimen/activity_vertical_margin"    android:paddingLeft="@dimen/activity_horizontal_margin"    android:paddingRight="@dimen/activity_horizontal_margin"    android:paddingTop="@dimen/activity_vertical_margin"    >    <Button        android:layout_centerInParent="true"        android:id="@+id/butJump"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:text="跳转到第二个Activity"/>    <Button        android:layout_below="@id/butJump"        android:layout_centerInParent="true"        android:id="@+id/butSend"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:text="发消息"/></RelativeLayout>

Main2XML

<?xml version="1.0" encoding="utf-8"?><RelativeLayout    xmlns:android="http://schemas.android.com/apk/res/android"    xmlns:tools="http://schemas.android.com/tools"    android:id="@+id/activity_main2"    android:layout_width="match_parent"    android:layout_height="match_parent"    android:paddingBottom="@dimen/activity_vertical_margin"    android:paddingLeft="@dimen/activity_horizontal_margin"    android:paddingRight="@dimen/activity_horizontal_margin"    android:paddingTop="@dimen/activity_vertical_margin"    >    <TextView        android:id="@+id/tv"        android:text="收到的消息:"        android:textSize="20sp"        android:layout_width="wrap_content"        android:layout_height="wrap_content"/>    <TextView        android:id="@+id/tvvv"        android:text="这里是第二个Activity"        android:layout_centerInParent="true"        android:textSize="20sp"        android:layout_width="wrap_content"        android:layout_height="wrap_content"/>    <Button        android:id="@+id/butTo3"        android:layout_below="@id/tvvv"        android:text="跳转到第三个Activity"        android:layout_centerHorizontal="true"        android:layout_width="wrap_content"        android:layout_height="wrap_content"/></RelativeLayout>

Main3XML

<?xml version="1.0" encoding="utf-8"?><RelativeLayout    xmlns:android="http://schemas.android.com/apk/res/android"    android:id="@+id/activity_main2"    android:layout_width="match_parent"    android:layout_height="match_parent"    android:paddingBottom="@dimen/activity_vertical_margin"    android:paddingLeft="@dimen/activity_horizontal_margin"    android:paddingRight="@dimen/activity_horizontal_margin"    android:paddingTop="@dimen/activity_vertical_margin"    >    <TextView        android:id="@+id/tv3"        android:text="收到的消息3.:"        android:textSize="20sp"        android:layout_width="wrap_content"        android:layout_height="wrap_content"/>    <TextView        android:text="这里是第三个Activity"        android:layout_centerInParent="true"        android:textSize="20sp"        android:layout_width="wrap_content"        android:layout_height="wrap_content"/></RelativeLayout>
容器类

//EventBus消息类,一个容器,负责存放一些数据,方便另一个订阅者(接受者),获取消息public class EventMessage {    //定义发送的数据类型    public  String  message;    //有参构造    public EventMessage(String message) {        this.message = message;    }    //get方法    public String getMessage() {        return message;    }    List<String> list;    public List<String> getList() {        return list;    }    public void setList(List<String> list) {        this.list = list;    }}

完了注册一下Activity  (如果你是粘的)




原创粉丝点击