編輯:關於Android編程
導語,EventBus大家應該不陌生,EventBus是一款針對Android優化的發布/訂閱事件總線。主要功能是替代Intent,Handler,BroadCast在Fragment,Activity,Service,線程之間傳遞消息.優點是開銷小,代碼更優雅。以及將發送者和接收者解耦。反正能幫助我們快速開發,這個確實是個好東西
地址:https://github.com/greenrobot/EventBus
我這裡就簡單的聊聊怎麼去使用和實踐了,在這裡,要感謝一下開原作者,也就是《Android源碼設計模式解析和實戰》的作者何紅輝
EventBus已經更新到了3.0了,也優化得更多好了,推薦使用3.0及以上版本,這裡先放上一張GitHub上的介紹圖
好的,我們一步步來分析這張圖
既然是個庫,我們首先要做的,肯定是引入他的依賴了
compile 'org.greenrobot:eventbus:3.0.0'
將事件放在隊列裡,用於管理和分發 保證應用的各個部分之間高效的通信及數據,事件分發 模塊間的解耦如果是Eclipse,那就自行去Github上下載jar包添加到libs目錄下
這裡我們要明白一個概念,就是事件總線管理,明白了事件總線管理,你就知道這個庫的妙用了,我們分三點來概述
發布者 訂閱者 事件 總線當然啦,這樣說可能有點籠統,我們再來分析一下,關於事件總線,一共四個部分
訂閱 注冊 發布 取消注冊這也就迎合我們事件總線的思想了,訂閱者可以訂閱多個事件,發布者也可以發布任何事件,發布者同時也可以是訂閱者,他的步驟
現在是不是對EventBus有一個大概的輪廓啦?現在我們理解這張圖就簡單多了,發布者把事件發布到總線裡面再進行分發
我們按照流程來
//注冊
EventBus.getDefault().register(this);
一句話就注冊,當然,他裡面不光可以傳上下文,還可以傳類和事件訂閱參數
@Override
protected void onDestroy() {
super.onDestroy();
//取消注冊
EventBus.getDefault().unregister(this);
}
取消注冊同樣的,裡面也可以和注冊一樣傳遞參數,我們後面詳細說
直接發布 滯留發布發布有兩種
//直接發布,接收對象
EventBus.getDefault().post("發布");
//滯留發布
EventBus.getDefault().postSticky("滯留發布");
這也是他的一個優勢的地方,在3.0之前的版本,我們是這樣的
//主線程事件處理
public void onEvent(MessageEvent event) {
log(event.message);
}
//交互式線程事件處理
public void onEventMainThread(MessageEvent event) {
textField.setText(event.message);
}
//後台線程處理
public void onEventBackgroundThread(MessageEvent event) {
saveToDisk(event.message);
}
https://github.com/greenrobot/EventBus/blob/master/HOWTO.md#delivery-threads-and-threadmodes3.0之後,我們看官方文檔
事件處理就需要這樣使用了
/*
*UserEvent需要自己定義
*/
//在ui線程執行
@Subscribe(threadMode = ThreadMode.MainThread)
public void onUserEvent(UserEvent event) {
}
//在後台線程執行
@Subscribe(threadMode = ThreadMode.BackgroundThread)
public void onUserEvent(UserEvent event) {
}
//強制在後台執行
@Subscribe(threadMode = ThreadMode.Async)
public void onUserEvent(UserEvent event) {
}
//默認方式, 在發送線程執行
@Subscribe(threadMode = ThreadMode.PostThread)
public void onUserEvent(UserEvent event) {
}
MainThread BackgroundThread Async PostThread我們可以注解在方法名上面標記,Subscribe是訂閱者的意識,我們定義一個threadMode ,四種模式
大意就是這樣,不知道大家理解了多少?總的來說,就是注冊了之後,就可以,比如我這邊發送一個消息數據,你那邊就可以接收了
我們直接來一個小例子吧,例子也是非常的簡單,在一個地方發送一個數據消息事件,另一個地方去接收,這個應該不難,大家都知道做,我們新建一個工程——EventBus
我們首先注冊,在把取消注冊綁定在onDestroy()上,不多說,這裡我們的主布局沒什麼東西,一個按鈕點擊發送,一個textview去接收<喎?/kf/ware/vc/" target="_blank" class="keylink">vcD4NCjwvYmxvY2txdW90ZT4NCjxoMyBpZD0="layoutmainxml">layout_main.xml
我們還需要一個實體類去保存數據
UserEvent
package com.lgl.eventbus; /** * 實體類 * Created by lgl on 2016/5/9. */ public class UserEvent { /** * 這裡你傳遞什麼類型你就寫什麼類型 */ //文本 private String text; public String getText() { return text; } public void setText(String text) { this.text = text; } }
接著,我們在Button的點擊事件中去發送我們的自定義消息
@Override public void onClick(View v) { switch (v.getId()) { case R.id.btn_send: //發送自定義消息 UserEvent event = new UserEvent(); event.setText("我是萌哒哒的消息!"); EventBus.getDefault().post(event); break; } }
然後我們在主線程匯總接收這個消息
//主線程接收消息 @Subscribe(threadMode = ThreadMode.MAIN) public void onUserEvent(UserEvent event) { //如果多個消息,可在實體類中添加type區分消息 tv_content.setText(event.getText()); }
這樣一個簡單的事件訂閱,接收就完成了,我們來看一下效果
這裡我所講的可能稍微簡單點,但是EventBus真的是一個很容易上手,又強大的庫,如果細心又愛專研的同學去github上看一下,也就大概的了解了一個思路,我作為一個老司機,也只是拋磚引玉了
本篇博客主要講解怎樣自定義一個circleIndicator控件?下一遍博客主要講解怎樣更改ViewPager切換的效果, 預計明天晚上之前更新。效果圖如下1)首先我們先
簡介通過android studio生成so庫的實踐。上一篇記錄的是通過eclipse生成so的方法eclipse生成so庫實踐,這裡記錄一下通過android stud
1. 第一種,使用 TabHost + ViewPager 實現該方法會有一個Bug,當設置tabHost.setCurrentTab()為0時,ViewPager不顯示
※效果 ※使用說明 Java代碼 import android.app.Activity; import android.os.Bundle; impo