Android項目中的網絡請求回調,你們通常都會使用Handler來進行界面UI的控制。若是在一個Activity中有多個請求,咱們所寫的Handler方法就會變得十分臃腫,難以閱讀。今天在網上看到一個第三方庫,能讓咱們換一種形式來處理這樣的需求。也就是EventBusjava
一、EventBus的簡單介紹android
這麼說應該包含4個成分:發佈者,訂閱者,事件,總線。網絡
那麼這四者的關係是什麼呢?app
很明顯:訂閱者訂閱事件到總線,發送者發佈事件。ide
大致應該是這樣的關係:post
訂閱者能夠訂閱多個事件,發送者能夠發佈任何事件,發佈者同時也能夠是訂閱者。this
二、EventBus的使用方式spa
咱們主要須要留意如下的接口方法。.net
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中的一個接一個。
以上部份內容涉及暴力,哈哈,打錯了。
涉及非原創問題,轉載出處