EventBus主要功能是替代Intent,Handler,BroadCast在Fragment,Activity,Service,线程之间传递消息,优点是开销小,代码更优雅。以及将发送者和接收者解耦。
首先创建一个实体类:这里不多说,直接上代码:
package com.cysd.wz_client.model; /** * Created by Administrator on 2016/3/2 0002. */ public class Event { private int opt; private String content; public Event() { } public Event(int opt, String content) { this.opt = opt; this.content = content; } public int getOpt() { return opt; } public void setOpt(int opt) { this.opt = opt; } public String getContent() { return content; } public void setContent(String content) { this.content = content; } }
然后再要接收的消息的页面注册(MainActivity),也就是需要把数据返回到的页面中。(代码如下)
EventBus.getDefault().register(this);
然后在要接收消息的页面反注册(MainActivity),反注册只能在onDestory()方法中反注册。代码如下:
@Override protected void onDestroy() { super.onDestroy(); EventBus.getDefault().unregister(this); }
在需要发送的消息的页面(Main2Activity),把需要传值的通过如下代码:
lv_comment.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { EventBus.getDefault().post(new Event(600, countyAdapter.getCurrentItem(position).getArea()));//区县列表)); Log.e("TAG", countyAdapter.getCurrentItem(position).getArea() + ""); finish(); } });lv_comment 其实就是一个Button按钮。重点代码在这里:
EventBus.getDefault().post(new Event(600, countyAdapter.getCurrentItem(position).getArea()));//区县列表));通过post 把请求发送出去, 然后这里的600 就相当于Intent 传值一样的 (说白了也相当于是键值对吧)600也就是键, 而这里我们要传的值 就是 countyAdapter.getCurrentItem(position)。getArea(); 这个。
到现在为止传值就已经写好了,我们还需要在接收消息的页面(MainActivity)页面进行获取值。不多说,直接上代码:
这个方法就是接受了消息
public void onEventMainThread(Event event) { switch (event.getOpt()) { case 600: Log.e("AGE", 600 + ""); tv_address.setText(event.getContent()); break; } }这里写的600 也就是需要 和你之前要发送消息(值)的页面中的600去匹配,如果一样,接受页面(MainActivity)接收到的就是发送消息页面(Main2Activity)传过来的值。
虽然讲的比较浅,但是我觉得传值这块应该理解到了。
希望这篇文章给那些传值不太方便的同学带来帮助。。