先说一下线程之间通讯的方式:
1.handler Message 2.AsyncTask 3.BroadCast 4.EventBus
主要方法:子线程的Runnable ,runOnuiThread()
//EventBus 的使用
首先EventBus 能够简化各组件的通信,解耦性高
三要素:
Event事件,他可以是任意类型
Subscriber 事件订阅者,在EventBus3.0之前我们必须定义onEvent开头的哪几个方法,分别是onEvent,onEventMainThred,onEventBackgroundThread和onEventAsync(),而在3.0之后事件处理的方法名可以随意取,不过需要加上注解@subcsricbe,并且制定线程模型,默认POSTING
Publisher事件的发布者。我们可以在任意线程里发布事件。一般情况下。使用EventBus.getDefault就可以得到一个EventBus对象,然后在调用post(Object)方法
EventBus 有四种线程模型,分别是:
POSTING(默认)表示事件处理函数的线程跟发布事件的线程在同一个线程
MAIN 表示事件处理函数的线程在主线程,因此在这里不能进行耗时操作。
BACKGROUND表示事件处理函数的线程在后台线程,因此不能进行ui操作。如果发布事件的线程是主线程,那么事件将会开启一个后台线程,如果发布事件的线程是在后台线程,那么事件处理函数就使用该线程。
ASYNC 表示无论事件发布的线程是哪一个,事件处理函数始终会新建一个子线程运行,同样不能进行UI操作
基本用法:
1.事件接收的类 参数可以是任何对象
public class MessageEvent{ private String message; public MessageEvent(String message){ this.message=message; } public String getMessage() { return message; } public void setMessage(String message) { this.message = message; } }
2.注册事件
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); EventBus.getDefault().register(this); }
解除事件
@Override protected void onDestroy() { super.onDestroy(); if (EventBus.getDefault().isRegistered(this)){ EventBus.getDefault().unregister(this); } }
处理事件
@Subscribe(threadMode = ThreadMode.MAIN) public void Event(MessageEvent messageEvent){ //这个感觉要比启动activity 要好的很多 这边要接收回传回来的信息 tv.setText(messageEvent.getMessage()); }
发布事件
EventBus.getDefault().post(new MessageEvent("欢迎大家浏览我写的博客"));
指定你想要的任何事件类型