EnentBus进行页面间的传值
来源:互联网 发布:四万亿计划后果 知乎 编辑:程序博客网 时间:2024/06/03 18:00
EventBus是一款针对Android优化的发布/订阅事件总线。主要功能是替代Intent,Handler,BroadCast
在Fragment,Activity,Service,线程之间传递消息.优点是开销小,代码更优雅。
以及将发送者和接收者解耦。
EventBus的四个接收函数
1、onEvent
2、onEventMainThread
3、onEventBackgroundThread
4、onEventAsync
这四种订阅函数都是使用onEvent开头的,它们的功能稍有不同,在介绍不同之前先介绍两个概念:
告知观察者事件发生时通过EventBus.post函数实现,这个过程叫做事件的发布,观察者被告知事件发生叫做事件的接收,是通过下面的订阅函数实现的。
讲来讲去就是说一个问题:消息的接收是根据参数中的类名来决定执行哪一个的;
参数是那个类就执行那个方法
onEvent:如果使用onEvent作为订阅函数,那么该事件在哪个线程发布出来的,onEvent就会在这个线程中运行,也就是说发布事件和接收事件线程在同一个线程。使用这个方法时,在onEvent方法中不能执行耗时操作,如果执行耗时操作容易导致事件分发延迟。
onEventMainThread:如 果使用onEventMainThread作为订阅函数,那么不论事件是在哪个线程中发布出来的,onEventMainThread都会在UI线程中执 行,接收事件就会在UI线程中运行,这个在Android中是非常有用的,因为在Android中只能在UI线程中跟新UI,所以在 onEvnetMainThread方法中是不能执行耗时操作的。
onEventBackground:如果使用onEventBackgrond作为订阅函数,那么如果事件是在UI线程中发布出来的,那么onEventBackground就会在子线程中运行,如果事件本来就是子线程中发布出来的,那么onEventBackground函数直接在该子线程中执行。
onEventAsync:使用这个函数作为订阅函数,那么无论事件在哪个线程发布,都会创建新的子线程在执行onEventAsync.
1、下载EventBus的类库源码:https://github.com/greenrobot/EventBus2、基本使用(1)自定义一个类,可以是空类,比如:[java]view plaincopypublic class AnyEventType { public AnyEventType(){} } (2)在要接收消息的页面注册:[java]view plaincopyeventBus.register(this); (3)发送消息[java]view plaincopyeventBus.post(new AnyEventType event); (4)接受消息的页面实现(共有四个函数,各功能不同,这是其中之一,可以选择性的实现,这里先实现一个):[java]view plaincopy // 订阅消息的方法有4个. // 这个方法用来接受消息:订阅消息. public void onEventMainThread(FristEvent event) { Bitmap bitmap = event.getBitmap(); iv.setImageBitmap(bitmap); } public void onEvent(FristEvent event) { } public void onEventAsync() { } public void onEventBackgroundThread() { }(5)解除注册[java]view plaincopyeventBus.unregister(this); 顺序就是这么个顺序,可真正让自己写,估计还是云里雾里的,下面举个例子来说明下。首先,在EventBus中,获取实例的方法一般是采用EventBus.getInstance()来获取默认的EventBus实例,当然你也可以new一个又一个,个人感觉还是用默认的比较好,以防出错。//第一步 建立要传递的javabeanpackage com.zhuang.eventbus;import android.graphics.Bitmap; public class FristEvent { private Bitmap bitmap; public FristEvent(Bitmap bitmap) { this.bitmap = bitmap; } public Bitmap getBitmap() { return bitmap; } public void setBitmap(Bitmap bitmap) { this.bitmap = bitmap; }}//第二步 先将消息发出去package com.zhuang.eventbus;import java.io.IOException;import org.apache.http.HttpResponse;import org.apache.http.client.HttpClient;import org.apache.http.client.methods.HttpGet;import org.apache.http.impl.client.DefaultHttpClient;import org.apache.http.util.EntityUtils;import android.app.IntentService;import android.content.Intent;import android.graphics.Bitmap;import android.graphics.BitmapFactory;import de.greenrobot.event.EventBus;public class DownService extends IntentService { public DownService() { super(""); } @Override protected void onHandleIntent(Intent intent) { HttpClient client = new DefaultHttpClient(); HttpGet request = new HttpGet(getResources() .getString(R.string.img_url)); try { HttpResponse response = client.execute(request); if (response.getStatusLine().getStatusCode() == 200) { byte[] data = EntityUtils.toByteArray(response.getEntity()); Bitmap bitmap = BitmapFactory.decodeByteArray(data, 0, data.length); // 将bitmap返回到Activity中 // 消息发布: EventBus.getDefault().post(new FristEvent(bitmap)); } } catch (IOException e) { e.printStackTrace(); } }}//第三步 注册事件总线,接收这个消息package com.zhuang.eventbus;import android.app.Activity;import android.content.Intent;import android.graphics.Bitmap;import android.os.Bundle;import android.view.View;import android.widget.ImageView;import de.greenrobot.event.EventBus;public class MainActivity extends Activity { private ImageView iv; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); iv = (ImageView) findViewById(R.id.iv); // 注册事件总线 EventBus.getDefault().register(this); } public void down(View v) { startService(new Intent(this, DownService.class)); } // 订阅消息的方法有4个. // 这个方法用来接受消息:订阅消息. public void onEventMainThread(FristEvent event) { Bitmap bitmap = event.getBitmap(); iv.setImageBitmap(bitmap); } public void onEvent(FristEvent event) {} public void onEventAsync() {} public void onEventBackgroundThread() {} @Override protected void onDestroy() { super.onDestroy(); // 取消事件总线的注册 EventBus.getDefault().unregister(this); }}EventBus进阶练习package com.longyue.eventbushigh;import de.greenrobot.event.EventBus;import android.app.Activity;import android.os.Bundle;import android.util.Log;import android.view.View;import android.view.View.OnClickListener;import android.widget.Button;public class MainActivity extends Activity implements OnClickListener{ private Button btn_FirstEvent, btn_SecondEvent, btn_ThirdEvent; @Override protected void onResume(){ super.onResume(); //注册事件总线 EventBus.getDefault().register(this); } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); initView(); } public void onEventMainThread(FirstEvent event) { Log.e("harvic", "onEventMainThread收到了消息:" + event.getMsg()); } // SecondEvent接收函数一 public void onEventMainThread(SecondEvent event) { Log.e("harvic", "onEventMainThread收到了消息:" + event.getMsg()); } // SecondEvent接收函数二 public void onEventBackgroundThread(SecondEvent event) { Log.e("harvic", "onEventBackground收到了消息:" + event.getMsg()); } // SecondEvent接收函数三 public void onEventAsync(SecondEvent event) { Log.e("harvic", "onEventAsync收到了消息:" + event.getMsg()); } public void onEvent(ThirdEvent event) { Log.e("harvic", "OnEvent收到了消息:" + event.getMsg()); } @Override protected void onDestroy() { super.onDestroy(); //取消事件总线的注册 EventBus.getDefault().unregister(this); } private void initView() { btn_FirstEvent = (Button) findViewById(R.id.btn_first_event); btn_SecondEvent = (Button) findViewById(R.id.btn_second_event); btn_ThirdEvent = (Button) findViewById(R.id.btn_third_event); btn_FirstEvent.setOnClickListener(this); btn_SecondEvent.setOnClickListener(this); btn_ThirdEvent.setOnClickListener(this); } @Override public void onClick(View v) { switch (v.getId()) { case R.id.btn_first_event: EventBus.getDefault().post(new FirstEvent("FirstEvent btn clicked")); break; case R.id.btn_second_event: EventBus.getDefault().post(new SecondEvent("SecondEvent btn clicked")); break; case R.id.btn_third_event: EventBus.getDefault().post(new ThirdEvent("ThirdEvent btn clicked")); break; } }}
- EnentBus进行页面间的传值
- 两个静态的页面嵌入动态页面进行传值
- 二页面间进行传值,回显
- js进行页面传值
- 用Struts2进行jsp页面的传值
- 利用代理模式进行页面之间的传值
- 利用 InitializingBean Jackson的ObjectMapper 进行页面传值
- 小程序如何进行页面之前的传值
- jsp 页面之间进行值的传递
- javascript页面间进行传值(弹出对话框形式)
- EnentBus 源码解析
- Android EnentBus 简单使用。
- 使用Querystring进行页面传值
- Activity之间进行页面传值
- 利用dialogArguments进行网页页面传值
- ASP.NET中进行页面传值
- 利用dialogArguments进行网页页面传值
- HTML5 使用 sessionStorage 进行页面传值
- spring initialize-database 使用方法
- 最简单的获取手机IP
- Maven引入依赖后自动下载并关联源码
- 人声频率范围及各频段音色效果
- Visual Sutdio2015 C++嵌入Lua脚本环境配置
- EnentBus进行页面间的传值
- 解决子view加点击后父布局不能滑动问题
- 命令在程序脚本中调用与串口执行结果不一致?
- hdu1025 最长上升子序列
- 苹果邓白氏编码申请
- Linux hrtimer分析--配置高精度模式
- 如何快熟集成支付宝
- C++ 学习第二天
- 相对定位和绝对定位