EventBus 學習,自動重新整理首頁功能
1.EventBus
1.1 EventBus是什麼?
EventBus由greenrobot組織貢獻(該組織還貢獻了greenDAO),一個Android事件釋出/訂閱輕量級框架,下面來一張圖作為說明。
EventBus說明
1.2 EventBus優勢
-
我們可以通過解耦釋出者和訂閱者簡化Android事件傳遞。
-
EventBus可以代替Android傳統的Intent、Handler、Broadcast或介面函式,在Fragment,Activity,Service執行緒之間傳遞資料,執行方法,而且程式碼簡單。
- 快,高效能:特別是在注重效能的Android上。也許在其同類的解決方案是最快的。
- 小(jar包小於50K),但是強大:EventBus是一個很小的庫,它的API超級簡單。
- android主執行緒傳遞:當和UI互動的時候,無論這個事件是怎麼提交的,EventBus都可以在主執行緒傳遞事件。
1.3 使用教程
1.3.1 新增依賴
首先在你的專案中新增eventbus的依賴
implementation 'org.greenrobot:eventbus:3.1.1'
1.3.2 註冊銷燬EventBus
接著,在接收Activity的onCreate()方法中註冊EventBus
EventBus.getDefault().register(this);
其次,在接收Activity的onDestory()中登出EventBus
@Override
protected void onDestroy() {
super.onDestroy();
if(EventBus.getDefault().isRegistered(this)) {
EventBus.getDefault().unregister(this);
}
}
1.3.3 更新UI
值得注意的是,對於接收端更新UI的操作最好在主執行緒
// 在主執行緒更新UI
@Subscribe(threadMode = ThreadMode.MAIN)
public void Event(String string) {
textView.setText(string);
}
1.3.4 完整程式碼
接收端activity程式碼。
public class MainActivity extends AppCompatActivity {
private Button btnCommon;
private TextView textView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// 首先要在你要接受EventBus的介面註冊,這一步很重要
EventBus.getDefault().register(this);
btnCommon = (Button) findViewById(R.id.btn_common);
textView = (TextView)findViewById(R.id.tv_content);
textView.setText("今天是星期五!");
jumpActivity();
}
private void jumpActivity() {
btnCommon.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent intent = new Intent(MainActivity.this, CommonActivity.class);
startActivity(intent);
}
});
}
// 在主執行緒更新UI
@Subscribe(threadMode = ThreadMode.MAIN)
public void Event(String string) {
textView.setText(string);
}
// 登出EventBus
@Override
protected void onDestroy() {
super.onDestroy();
if(EventBus.getDefault().isRegistered(this)) {
EventBus.getDefault().unregister(this);
}
}
}
下面在看傳送端,我們在點選事件中,加入一個EventBus事件,進行傳值。
public class CommonActivity extends AppCompatActivity {
private Button button;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.second_activity);
button = (Button) findViewById(R.id.btn2);
jumpActivity();
}
private void jumpActivity() {
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
EventBus.getDefault().post("歡迎大家!");
finish();
}
});
}
}
1.3.5 效果展示
第一個介面是接收Activity,第二個介面是傳送Activity,在第二個介面點選“進入跳轉到首頁”按鈕,會用EventBus傳遞需要更新的UI資料,並跳轉到第一個頁面。回到第一個頁面,EventBus接收,完成重新整理UI操作。
重新整理首頁功能
在實際開發中,我們經常會遇到這種需求:即在某一個模組,完成某一操作後。然後在首頁會進行要求同步顯示,進行UI更新。這要求實現首頁實時重新整理功能。針對這一需求,我考慮採用EventBus去實現。那麼怎麼實現呢,請您繼續閱讀。
2.1 需求分析
由於前端的資料都是請求後臺介面得到的,進而更新展示對應的UI,那麼重新整理流程為:
- 在特定頁面完成操作後,可以傳送一個更新指令給首頁
- 首頁接收指令後,首頁呼叫上拉,下拉方法
- 執行上拉下拉方法的過程中,向後臺對應介面進行請求,更新資料
- 更新資料後,改變UI,實現重新整理功能
2.2 實現程式碼
利用EventBus,我們可以在操作頁面向首頁傳送一個引數,告訴首頁進行重新整理操作。主要程式碼邏輯如下:
private void gameFinish() {
//傳送訊息首頁重新整理狀態
EventBusBean eventBusBean = new EventBusBean();
eventBusBean.setCode(EventBusConstant.TASK_REFRESH_CODE);
EventBus.getDefault().post(eventBusBean);
try {
// todo
// 邏輯操作
}
catch (Exception e) {
e.printStackTrace();
}
// todo 關閉頁面操作
}
在首頁接收中,我們在在主執行緒中執行重新整理操作,進而實現同步更新內容。
/**
* 接收傳遞來的資料進行重新整理
* @param eventBusBean 資料
*/
@Subscribe(threadMode = ThreadMode.MAIN)
public void getOnEvent(EventBusBean eventBusBean) {
if (eventBusBean.getCode() == EventBusConstant.TASK_REFRESH_CODE) {
if (checkSubjectBean != null) {
page = 1;
mSRefreshLayout.autoRefresh();
}
}
}
值得一說的是,在上面程式碼中 EventBusConstant.TASK_REFRESH_CODE 是我設定的一個完成標誌,這個引數首頁接收到後,就執行重新整理方法,重新進行網路請求,實現重新整理功能。
參考文獻