Android项目中的网络请求回调,大家一般都会使用Handler来进行界面UI的控制。如果在一个Activity中有多个请求,我们所写的Handler方法就会变得十分臃肿,难以阅读。今天在网上看到一个第三方库,能让我们换一种形式来处理这样的需求。也就是EventBus
1、EventBus的简单介绍
这么说应该包含4个成分:发布者,订阅者,事件,总线。
那么这四者的关系是什么呢?
很明显:订阅者订阅事件到总线,发送者发布事件。
大体应该是这样的关系:
订阅者可以订阅多个事件,发送者可以发布任何事件,发布者同时也可以是订阅者。
2、EventBus的使用方式
我们主要需要留意以下的接口方法。
EventBus.getDefault().register(this);//订阅事件
EventBus.getDefault().post(object);//发布事件
EventBus.getDefault().unregister(this);//取消订阅
//接收订阅
public void onEventMainThread(object item) {
}
EventBus这个第三方包到底要怎么使用呢,以下我用一个简单的demo展示一下,【点击按钮,完成一个界面的倒数功能】
(1)首先我们需要定义一个Event方法:
package com.dannytest.eventbus_demo;import java.util.List;import com.dannytest.eventbus_demo.bean.Item;public class Event { public static class CountEvent { private int count; public CountEvent(int count) { this.count = count; } public int getCount() { return count; } } }
这个是不是有点像get、set的构造方法呢。在我理解上呢,他确实就是这样的,所有的Event就是一个大类,如果我们需要处理某件事(对应这个类中的private属性),
作为发布者,我们利用post将倒数的结果存进(set)这个类当中。然后EventBus就会将这个结果发送到订阅者处(get)。
(2)然后我们就可以随意地使用EventBus了(当然eventbus.jar也是必不可少的,网上都能找到)。
package com.dannytest.eventbus_demo;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;import android.widget.TextView;import com.dannytest.testeventbus.R;import com.dannytest.eventbus_demo.Event.CountEvent;import de.greenrobot.event.EventBus;public class MoreCount extends Activity implements OnClickListener{ private TextView tv_count; private Button btn; @Override public void onClick(View v) { switch (v.getId()) { case R.id.btn_count: System.out.println("----------btnclick"); new Thread(){ @Override public void run() { super.run(); for(int i=50;i>0;i--){ try { //模拟0.5秒倒数一个数 Thread.sleep(500); //调用EventBus发布 EventBus.getDefault().post(new CountEvent(i)); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); System.out.println("----------post error"+e.getMessage()); } } } }.start(); break; default: break; } } @Override protected void onCreate(Bundle savedInstanceState) { // TODO Auto-generated method stub super.onCreate(savedInstanceState); setContentView(R.layout.activity_countmore); tv_count=(TextView) findViewById(R.id.tv_count); btn=(Button) findViewById(R.id.btn_count); btn.setOnClickListener(this); //订阅事件 EventBus.getDefault().register(this); } //这里是--订阅者收到信息后处理--该方法在UI线程中 public void onEventMainThread(CountEvent event) { tv_count.setText(event.getCount() + ""); } @Override protected void onDestroy() { // TODO Auto-generated method stub super.onDestroy(); //取消订阅事件 EventBus.getDefault().unregister(this); } }
这样,我们就通过EventBus的订阅与发布来实现了原来Handler处理UI界面的功能。
(3)EventBus的ThreadMode
EventBus包含4个ThreadMode:PostThread,MainThread,BackgroundThread,Async
MainThread我们已经不陌生了;我们已经使用过。
具体的用法,极其简单,方法名为:onEventPostThread, onEventMainThread,onEventBackgroundThread,onEventAsync即可
具体什么区别呢?
onEventMainThread代表这个方法会在UI线程执行
onEventPostThread代表这个方法会在当前发布事件的线程执行
BackgroundThread这个方法,如果在非UI线程发布的事件,则直接执行,和发布在同一个线程中。如果在UI线程发布的事件,则加入后台任务队列,使用线程池一个接一个调用。
Async 加入后台任务队列,使用线程池调用,注意没有BackgroundThread中的一个接一个。
以上部分内容涉及暴力,哈哈,打错了。
涉及非原创问题,转载出处