EventBus使用
2016-04-18 15:44
162 查看
序言
刚刚看了EventBus源码解析,自己也写了一个demo。下面简单的介绍一下EventBus.EventBus是一个为Android设计的事件发布与订阅系统。
注意:要订阅事件,你的类里面必须有一个相应事件的处理方法。改方法必须使用注解Suscribe声明。并且声明为public返回值为void,参数只能有一个。为了接受到事件,需要将你的类注册到EventBus上。在不需要的时候解除注册。
使用
第一步
使用EventBus首先定义一个事件类public class TestEvent { public String msg; public TestEvent(String msg) { this.msg = msg; } }
第二步
然后再你先要处理事件的类中编写,处理方法//注意在EventBus3.0以后使用注解的形式向EventBus声明这是一个处理指定事件的方法 //至于处理什么事件,则根据方法的参数决定,注意参数有且只有一个。 public void onGetMsg(TestEvent event){ String msg ="get on SecondActivity"+ event.msg; Toast.makeText(this, msg, Toast.LENGTH_LONG).show(); }
第三步
在需要的地方注册,例如在Activity的onCreat方法中,在其他的组件中也可以使用。EventBus.getDefault().register(this);
在不需要的地方,解除注册,防止内存泄漏。
EventBus.getDefault().unregister(this);
第四步
在需要发布消息的时候调用//post中为你想发布的消息类型 EventBus.getDefault().post(new TestEvent("post from ThirdActivity"));
Demo
小面是我的一个demo,思路是在第一个Activity中添加事件处理方法,并将自己注册到EventBus,点击按钮跳转到第二个Activity中。在第二个Activity中也有一个按钮,点击按钮发布事件,第一个Activity接受到事件,修改布局中的TextView,并用Toast显示出来。第一个Activity
package trs.com.learneventbus; import android.content.Intent; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.view.View; import android.widget.TextView; import android.widget.Toast; import org.greenrobot.eventbus.EventBus; import org.greenrobot.eventbus.Subscribe; import org.greenrobot.eventbus.ThreadMode; import trs.com.learneventbus.event.TestEvent; public class MainActivity extends AppCompatActivity implements View.OnClickListener { TextView textView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); textView= (TextView) findViewById(R.id.tv); findViewById(R.id.btn).setOnClickListener(this); EventBus.getDefault().register(this); } @Subscribe(threadMode = ThreadMode.MAIN,priority = 100) public void onGetMsg(TestEvent event){ String msg ="get on MainActivity"+ event.msg; textView.setText(msg); Toast.makeText(this,msg,Toast.LENGTH_LONG).show(); } @Override public void onClick(View v) { startActivity(new Intent(this,SecondActivity.class)); } @Override protected void onDestroy() { super.onDestroy(); EventBus.getDefault().unregister(this); } }
第一个布局文件
<?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:gravity="center" android:orientation="vertical" tools:context="trs.com.learneventbus.MainActivity"> <TextView android:id="@+id/tv" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Hello World!" /> <Button android:text="start" android:id="@+id/btn" android:layout_width="wrap_content" android:layout_height="wrap_content" /> </LinearLayout>
第二个Activity
public class SecondActivity extends AppCompatActivity implements View.OnClickListener { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_second); findViewById(R.id.btn).setOnClickListener(this); } @Override public void onClick(View v) { EventBus.getDefault().post(new TestEvent("post from ThirdActivity")); } }
第二个布局
<?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:layout_width="match_parent" android:layout_height="match_parent" tools:context="trs.com.learneventbus.SecondActivity"> <Button android:id="@+id/btn" android:text="post" android:layout_centerInParent="true" android:layout_width="wrap_content" android:layout_height="wrap_content" /> </RelativeLayout>
效果
高级
关于EventBus的高级用法,主要是关于注解Subscribe的使用:@Documented @Retention(RetentionPolicy.RUNTIME) @Target({ElementType.METHOD}) public @interface Subscribe { ThreadMode threadMode() default ThreadMode.POSTING; /** * If true, delivers the most recent sticky event (posted with * {@link EventBus#postSticky(Object)}) to this subscriber (if event available). */ boolean sticky() default false; /** Subscriber priority to influence the order of event delivery. * Within the same delivery thread ({@link ThreadMode}), higher priority subscribers will receive events before * others with a lower priority. The default priority is 0. Note: the priority does *NOT* affect the order of * delivery among subscribers with different {@link ThreadMode}s! */ int priority() default 0; }
注解中可以设置三个参数,threadMode,sticky,priority。它们表示事件回调的线程方式,是否是粘性的,优先级。
1.threadMode
threadMode是一个枚举,表示事件发生时,对处理方法的回调应该在哪个线程中进行。有四个选项:类型 | 用途 |
---|---|
POSTING | 表示事件的发布与处理都在同一个线程 |
MAIN | 事件的处理会在切换到主线程中,方便更新UI |
BACKGROUND | 事件的处理会在一个单独的线程中,如果发布的线程不是主线程,就直接在发布的线程中回调 |
ASYNC | 事件的处理会在一个单独的线程中,与发布事件不是同一个线程,即使不是在主线程中发布的。 |
2.sticky
如果sticky设置为true,EventBus则会自动的保存最新的一个事件,直到手动的移除,而且发布事件的时候使用的是EventBus.postSticky(event)
3.priority
priority是一个int类型的数,数值越大,越先接受到事件。设置方式如下
@Subscribe(threadMode = ThreadMode.MAIN,priority = 100,sticky =true) public void onGetMsg(TestEvent event){ String msg ="get on MainActivity"+ event.msg; textView.setText(msg); Toast.makeText(this,msg,Toast.LENGTH_LONG).show(); }
相关文章推荐
- 程序员需谨记的8条团队开发原则
- Android Studio 入门
- JAVA多线程计算ExecutorService
- Jmeter--google plugin插件监控被测系统资源方法
- Java-控制流语句
- Android实战技巧:ViewStub的应用
- 上传文件提示IO Error
- HttpServletResponse,HttpServletRequest详解
- Map.containsKey(String key)
- Runtime
- 基数排序,这个是倍增法上会用到
- java处理JSON格式数据的通用类-分享
- Java加密解密快速入门上篇【包括MD5、BASE64、DES、RSA等算法】
- eclipse再见,android studio 新手入门教程(二)项目的导入
- struts1.0 dispatchAction、全局跳转、动态表单
- 傅里叶变换
- 多柱汉诺塔最优算法设计探究
- Lightoj-1268 Unlucky Strings(kmp&&矩阵快速幂)
- ZOJ 3933 Team Formation (km算法)
- 技术走向管理一些思考(1)-性格特质和自我管理