博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Android EventBus详解
阅读量:2393 次
发布时间:2019-05-10

本文共 4236 字,大约阅读时间需要 14 分钟。

在   中下载 EventBus
EventBus是Android下高效的发布/订阅事件总线机制。作用是可以代替传统的Intent,Handler,Broadcast或接口函数在Fragment,Activity,Service,线程之间传递数据,执行方法
使用方法
1> 定义事件, 定义一个类,继承默认的Object即可,用于区分事件和传输数据,如:
public class MsgEvent1 {
  private String msg;
  public MsgEvent1(String msg)
  {
  super ();
  this .msg = msg;
  }
  public String getMsg()
  {
  return msg ;
  }
}
public class MsgEvent2 {
  private String msg;
  public MsgEvent2(String msg)
  {
  super ();
  this .msg = msg;
  }
  public String getMsg()
  {
  return msg ;
  }
}
2> 添加订阅者:EventBus.getDefault().register(this); 将所在类作为订阅者,框架会通过反射机制获取所有方法及其参数,有如下四种方法:
订阅者所在类可以定义以下一个或多个方法用以接收事件:
  public void onEvent(param)
  public void onEventMainThread(param)
  public void onEventBackgroundThread(param)
  public void onEventAsync(param)
如:
public class RightFragment extends Fragment {
  private TextView tv;
  @Override
  public void onCreate(Bundle savedInstanceState) {
    super .onCreate(savedInstanceState);
    // 界面创建时,订阅事件, 接受消息
    EventBus. getDefault().register( this);
  }
  @Override
  public void onDestroy() {
    super .onDestroy();
    // 界面销毁时,取消订阅
    EventBus. getDefault().unregister( this);
  }
  @Override
  public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.fragment_right , null);
    tv = (TextView) view.findViewById(R.id. tv );
    return view;
  }
  /**
  * 与发布者在同一个线程
  *
  * @param msg
  * 事件1
  */
  public void onEvent(MsgEvent1 msg) {
    String content = msg.getMsg() + "\n ThreadName: " + Thread.currentThread ().getName() + "\n ThreadId: " + Thread.currentThread().getId();
    System. out .println("onEvent(MsgEvent1 msg)收到" + content);
  }
  /**
  * 执行在主线程。 非常实用,可以在这里将子线程加载到的数据直接设置到界面中。
  *
  * @param msg
  * 事件1
  */
  public void onEventMainThread(MsgEvent1 msg) {
    String content = msg.getMsg() + "\n ThreadName: " + Thread.currentThread ().getName() + "\n ThreadId: " + Thread.currentThread().getId();
    System. out .println("onEventMainThread(MsgEvent1 msg)收到" + content);
    tv.setText(content);
  }
  /**
  * 执行在子线程,如果发布者是子线程则直接执行,如果发布者不是子线程,则创建一个再执行 此处可能会有线程阻塞问题。
  *
  * @param msg
  * 事件1
  */
  public void onEventBackgroundThread(MsgEvent1 msg) {
    String content = msg.getMsg() + "\n ThreadName: " + Thread.currentThread ().getName() + "\n ThreadId: " + Thread.currentThread().getId();
    System. out .println("onEventBackgroundThread(MsgEvent1 msg)收到" + content);
  }
  /**
  * 执行在在一个新的子线程 适用于多个线程任务处理, 内部有线程池管理。
  *
  * @param msg
  * 事件1
  */
  public void onEventAsync(MsgEvent1 msg) {
    String content = msg.getMsg() + "\n ThreadName: " + Thread.currentThread ().getName() + "\n ThreadId: " + Thread.currentThread().getId();
    System. out .println("onEventAsync(MsgEvent1 msg)收到" + content);
  }
  /**
  * 与发布者在同一个线程
  *
  * @param msg
  * 事件2
  */
  public void onEvent(MsgEvent2 msg) {
    String content = msg.getMsg() + "\n ThreadName: " + Thread.currentThread ().getName() + "\n ThreadId: " + Thread.currentThread().getId();
    System. out .println("onEvent(MsgEvent2 msg)收到" + content);
    tv.setText(content);
  }
}
注:发布者 post方法参数是Object类型,也就是可以发布任何事件。订阅者接受消息时,只要定义的是第二步四个方法任意一个,并且参数和发布者发布的一致,即可被执行。发布者也可以通过第二步接收消息,订阅者也可以作为发布者发消息给自己
3> 发布者发布事件
public class LeftFragment extends ListFragment {
  @Override
  public void onViewCreated(View view, Bundle savedInstanceState) {
    super .onViewCreated(view, savedInstanceState);
    String[] strs = new String[] { "主线程消息1" , "子线程消息1" , "主线程消息2" };
    setListAdapter( new ArrayAdapter<String>(getActivity(), android.R.layout.simple_list_item_1 , strs));
  }
  @Override
  public void onListItemClick(ListView l, View v, int position, long id) {
    switch (position) {
      case 0: 
// 主线程
        System. out .println("----------------------主线程发的消息1" + " threadName: " + Thread.currentThread().getName() + " threadId: " + Thread.currentThread().getId());
        EventBus. getDefault().post( new MsgEvent1( "主线程发的消息1" ));
      break ;
      case 1: 
// 子线程
        new Thread() {
          public void run() {
              System. out .println("----------------------子线程发的消息1" + " threadName: " + Thread.currentThread().getName() + " threadId: " + Thread.currentThread().getId());
              EventBus. getDefault().post( new MsgEvent1( "子线程发的消息1" ));
          };
        }.start();
      break ;
      case 2: 
// 主线程
        System. out .println("----------------------主线程发的消息2" + " threadName: " + Thread.currentThread().getName() + " threadId: " + Thread.currentThread().getId());
        EventBus. getDefault().post( new MsgEvent2("主线程发的消息2" ));
      break ;
      }
  }
}

转载地址:http://osgab.baihongyu.com/

你可能感兴趣的文章
FreeBSD kernel NFS client local vulnerabilities
查看>>
MXML 文件中的xmlns是什么意思?
查看>>
Flex Builder 中的工作空间、项目
查看>>
Flex 获得远程数据
查看>>
Flash Builder 4字体设置
查看>>
OpenGL坐标系
查看>>
VS2008快捷键大全
查看>>
Mysql Fabric实现学习笔记
查看>>
Spring JTA multiple resource transactions in Tomcat with Atomikos example
查看>>
How to setup multiple data sources with Spring and JPA
查看>>
MySQL 5.7 Fabric: any good?
查看>>
Accessing Fabric HA Groups from Java
查看>>
Fabric FAQ
查看>>
boost 1.39编译安装手记
查看>>
树莓派安装中文输入法
查看>>
树莓派(raspberry pi)播发flash 远程登录 视频播放
查看>>
Perform Two Phase Commits in MongoDB
查看>>
java.rmi.ConnectException: Connection refused to host: 127.0.0.1
查看>>
数据库服务器 Cloudscape
查看>>
java -D参数简化加入多个jar
查看>>