1. 程式人生 > >Android之利用EventBus進行訊息傳遞

Android之利用EventBus進行訊息傳遞

前言:EventBus是上週專案中用到的,網上的文章大都一樣,或者過時,有用的沒幾篇,經過琢磨,請教他人,也終於弄清楚點眉目,記錄下來分享給大家。

一、概述

EventBus是一款針對Android優化的釋出/訂閱事件匯流排。主要功能是替代Intent,Handler,BroadCast在Fragment,Activity,Service,執行緒之間傳遞訊息.優點是開銷小,程式碼更優雅。以及將傳送者和接收者解耦。
1、下載EventBus的類庫
原始碼:https://github.com/greenrobot/EventBus

2、基本使用

(1)自定義一個類,可以是空類,比如:

  1. publicclass AnyEventType {  
  2.      public AnyEventType(){}  
  3.  }  

(2)在要接收訊息的頁面註冊:

  1. eventBus.register(this);  

(3)傳送訊息

  1. eventBus.post(new AnyEventType event);  

(4)接受訊息的頁面實現(共有四個函式,各功能不同,這是其中之一,可以選擇性的實現,這裡先實現一個):

  1. publicvoid onEvent(AnyEventType event) {}  
(5)解除註冊
  1. eventBus.unregister(this);  
順序就是這麼個順序,可真正讓自己寫,估計還是雲裡霧裡的,下面舉個例子來說明下。

首先,在EventBus中,獲取例項的方法一般是採用EventBus.getInstance()來獲取預設的EventBus例項,當然你也可以new一個又一個,個人感覺還是用預設的比較好,以防出錯。

二、實戰

先給大家看個例子:

當擊btn_try按鈕的時候,跳到第二個Activity,當點選第二個activity上面的First Event按鈕的時候向第一個Activity傳送訊息,當第一個Activity收到訊息後,一方面將訊息Toast顯示,一方面放入textView中顯示。


按照下面的步驟,下面來建這個工程:

1、基本框架搭建

想必大家從一個Activity跳轉到第二個Activity的程式應該都會寫,這裡先稍稍把兩個Activity跳轉的程式碼建起來。後面再新增EventBus相關的玩意。

MainActivity佈局(activity_main.xml)

  1. <LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"
  2.     xmlns:tools="http://schemas.android.com/tools"
  3.     android:layout_width="match_parent"
  4.     android:layout_height="match_parent"
  5.     android:orientation="vertical">
  6.     <Button
  7.         android:id="@+id/btn_try"
  8.         android:layout_width="match_parent"
  9.         android:layout_height="wrap_content"
  10.         android:text="btn_bty"/>
  11.     <TextView
  12.         android:id="@+id/tv"
  13.         android:layout_width="wrap_content"
  14.         android:layout_height="match_parent"/>
  15. </LinearLayout>
新建一個Activity,SecondActivity佈局(activity_second.xml)
  1. <LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"
  2.     xmlns:tools="http://schemas.android.com/tools"
  3.     android:layout_width="match_parent"
  4.     android:layout_height="match_parent"
  5.     android:orientation="vertical"
  6.     tools:context="com.harvic.try_eventbus_1.SecondActivity">
  7.     <Button
  8.         android:id="@+id/btn_first_event"
  9.         android:layout_width="match_parent"
  10.         android:layout_height="wrap_content"
  11.         android:text="First Event"/>
  12. </LinearLayout>
MainActivity.java (點選btn跳轉到第二個Activity)
  1. publicclass MainActivity extends Activity {  
  2.     Button btn;  
  3.     @Override
  4.     protectedvoid onCreate(Bundle savedInstanceState) {  
  5.         super.onCreate(savedInstanceState);  
  6.         setContentView(R.layout.activity_main);  
  7.         btn = (Button) findViewById(R.id.btn_try);  
  8.         btn.setOnClickListener(new View.OnClickListener() {  
  9.             @Override
  10.             publicvoid onClick(View v) {  
  11.                 // TODO Auto-generated method stub
  12.                 Intent intent = new Intent(getApplicationContext(),  
  13.                         SecondActivity.class);  
  14.                 startActivity(intent);  
  15.             }  
  16.         });  
  17.     }  
  18. }  
到這,基本框架就搭完了,下面開始按步驟使用EventBus了。

2、新建一個類FirstEvent

  1. package com.harvic.other;  
  2. publicclass FirstEvent {  
  3.     private String mMsg;  
  4.     public FirstEvent(String msg) {  
  5.         // TODO Auto-generated constructor stub
  6.         mMsg = msg;  
  7.     }  
  8.     public String getMsg(){  
  9.         return mMsg;  
  10.     }  
  11. }  
這個類很簡單,構造時傳進去一個字串,然後可以通過getMsg()獲取出來。

3、在要接收訊息的頁面註冊EventBus:

在上面的GIF圖片的演示中,大家也可以看到,我們是要在MainActivity中接收發過來的訊息的,所以我們在MainActivity中註冊訊息。

通過我們會在OnCreate()函式中註冊EventBus,在OnDestroy()函式中反註冊。所以整體的註冊與反註冊的程式碼如下:

  1. package com.example.tryeventbus_simple;  
  2. import com.harvic.other.FirstEvent;  
  3. import de.greenrobot.event.EventBus;  
  4. import android.app.Activity;  
  5. import android.content.Intent;  
  6. import android.os.Bundle;  
  7. import android.util.Log;  
  8. import android.view.View;  
  9. import android.widget.Button;  
  10. import android.widget.TextView;  
  11. import android.widget.Toast;  
  12. 相關推薦

    Android利用EventBus進行訊息傳遞

    前言:EventBus是上週專案中用到的,網上的文章大都一樣,或者過時,有用的沒幾篇,經過琢磨,請教他人,也終於弄清楚點眉目,記錄下來分享給大家。 一、概述 EventBus是一款針對Android優化的釋出/訂閱事件匯流排。主要功能是替代Intent

    Android利用EventBus進行資料傳遞

    在專案中,不可避免的要在兩個頁面之間進行資料的傳遞,就算不傳遞,也需要進行重新整理之類的,我們根據Google提供的庫類方法,也是可以做的,主要有廣播broadcastreceiver,startactivity方法或者是application例項等等,都是可以工作的(只要

    Android利用ColorMatrix進行圖片的各種特效處理

    原圖:效果1:效果2: 效果3:效果4: 檢視官方的API,其中ColorMatrix的說明如下: 5x4 matrix for transforming the color+alpha components of a Bitmap. The matri

    Android OkHttp + EventBus 進行後臺下載網路檔案

    前言:        本篇文章純粹是個人學習日記。如有錯誤或不正確的地方,請指出,謝謝!        我在學習郭霖的《第一行程式碼》,就想找找有沒有比較簡便的方法替代第十章的最佳實踐網路下載去下載網路檔案。然後就想用EventBus代替其中的 AsyncTask 和 Int

    使用Vue開發網站路2-多元件通訊2(利用Vuex進行資料傳遞

    這裡還是非父子元件間的通訊 其實我也不喜歡看別人的大段程式碼,但這是最完整的,以後肯定有用(完整程式碼貼在最後面,自己看) 主要實現是使用vuex的公共空間存放資料,這個時候要問,那為什麼不之間用一個物件啊,其他也是可以的,但是vuex可以檢測你資料的變化,這個後期有用。

    PYTHON學習(三)利用python進行數據分析(1)---準備工作

    -- 下載 rip 安裝包 png 要求 eight code 電腦   學習一門語言就是不斷實踐,python是目前用於數據分析最流行的語言,我最近買了本書《利用python進行數據分析》(Wes McKinney著),還去圖書館借了本《Python數據分析基礎教程--N

    android hxgbus 待tag的訊息傳遞

    hxgbus 引入方式 allprojects { repositories { ... maven { url 'https://jitpack.io' } } } dependencies { implementat

    AndroidActivity間的資料傳遞

    主佈局 <?xml version="1.0" encoding="utf-8"?> <AbsoluteLayout xmlns:android="http://schemas.android.com/apk/res/android"

    Android利用Shareinstall進行多渠道一鍵自動打包!

    目前國內的安卓渠道有幾百家,我們要根據不同的渠道打不同渠道的apk來統計每個渠道帶來的使用者數,統計每個渠道使用者的存活率和活躍度等等資訊,但是手動對每個渠道的APK進行簽名打包實在是讓人感到厭煩且低效,這時我們需要一個全自動化的打包工具----Shareins

    Android利用NanoHttpd搭建伺服器

    NanoHttpd是一個開源庫,使用Java實現,可以在非常方便地整合到Android應用中去,實現了一個輕量級的 Web Server。 專案地址: https://github.com/NanoHttpd/nanohttpd 使用方法:在下面下載連結中下載nanoht

    Android使用HttpURLConnection進行網路訪問

    一、概述 在Android 上傳送HTTP 請求的方式一般有兩種:HttpURLConnection 和HttpClient。因為在Android 5.0之後,HttpClient被HttpURLConnecetion替代,後來在Android 6.0完全被捨

    Go 微服務:基於 RabbitMQ 和 AMQP 進行訊息傳遞

    歡迎大家前往騰訊雲+社群,獲取更多騰訊海量技術實踐乾貨哦~ 介紹 微服務就是將應用程式的業務領域劃分為具有明確範圍的不同場景,並以分離的流程來執行這些場景,使得其中跨邊界的任何持久化的關係必須依賴最終的一致性,而不是 ACID 類事務或外來鍵約束。這

    AndroidSocket檔案及訊息傳輸

    socket傳輸檔案時,只能通過流去讀取訊息。當socket接收檔案、訊息等不同的資料時,如何區別是字串還是流是很重要的。為了保證接收到的資料型別統一(資料是字串還是流),需要定義協議。定義協議的方式有很多種: 1.傳送一個握手訊號。 根據握手訊號來確定傳送的是字串還是流

    android利用opencv進行影象識別

    之前開發的時候老大讓研究下影象識別的功能,同事推薦看看opencv,發現對於移動端來說opencv的資料和demo都比較少,現在整理下之前的工作成果。 首先是進行配置工作,先匯入opencv的一個程式碼模組 之後是匯入opencv的具體的演算法,當然是c

    Android okhttp3 利用socket進行read/write的底層實現跟蹤

    在okhttp3.internal.io.RealConnection#connectSocket中初始化了socket並進行了connect,此時tcp的三次握手已經搞定,接下來它通過okio庫與遠端socket建立I/O連線,如下程式碼所示: /*

    androidIntent複雜資料的傳遞一(Object型別的資料)

    使用Serializable方式   前提:Object需要實現Serializable介面 Serializable方式傳遞Object的語法:bundle.putSerializable(key,object); 用Serializable方式接收Object的語法:o

    androidIntent複雜資料的傳遞(ArrayList型別的資料)

    傳遞ArrayList<String> 傳遞ArrayList<String>型別資料的方法 1)在建立的專案工程裡面建立一個用來發送資料的SendActivity類,具體程式碼如下: package zjh.android.lx; import

    (安卓) 購物車二級列表,計算和全反選 以及 EventBus訊息傳遞

    先看效果圖: MainActivity; import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import android.view.View; import androi

    Android利用TextWatcher製作自定義編輯文字框

    自定義編輯文字框怎麼造呢? 利用Textwatcher觀察者來自定義。 首先,我們看下程式碼: <span style="font-size:18px;">package com.example.boom.messageproject.ui; import a

    訊息傳遞:IOS NSNotificationCenter,Android EventBus;

    IOS IOS系統自帶 NSNotificationCenter 0,上圖 1,初始化程式入口 - (BOOL)application:(UIApplication *)application didFinishLaunchingW