Android —— EventBus使用簡介

来源:https://www.cnblogs.com/yunfang/archive/2020/07/15/13306735.html
-Advertisement-
Play Games

參考博客:https://blog.csdn.net/harvic880925/article/details/40660137 EventBus簡介 EventBus有哪些優點 Demo案例分享及問題解決 一、什麼是EventBus 由greenboot組織貢獻(該組織還貢獻了greenDAO), ...


參考博客:https://blog.csdn.net/harvic880925/article/details/40660137

  • EventBus簡介
  • EventBus有哪些優點
  • Demo案例分享及問題解決

一、什麼是EventBus

      由greenboot組織貢獻(該組織還貢獻了greenDAO),一個Android事件發佈/訂閱輕量級框架。

      EventBus可以代替Android傳統的Intent,Handler,Broadcast或介面函數,在Fragment,Activity,Service線程之間傳遞數據,執行方法。

      EventBus有五種線程模式分別是:

  1. POSTING:預設,表示事件處理函數的線程和發佈事件的線程在同一個線程。
  2. MAIN:表示事件處理函數的線程在UI主線程(不能進行耗時操作)
  3. BACKGROUND:表示事件處理函數的線程在後臺線程,因此不能進行UI操作,如果發佈事件的線程是UI主線程那麼時間處理函數將會開啟一個後臺線程,如果發佈事件的函數在後臺線程,那麼事件處理函數就使用該線程。
  4. ASYNC:表示無論時間發佈的線程是哪一個,事件處理函數始終會新建一個子線程運行(不能進行UI操作)
  5. MAIN_ORDERED:EventBus3.1.1之後新加入的,和MAIN不同的是一定會排隊執行

二、EventBus有哪些優點?

  • 簡化了組件間的通訊。
  • 分離了事件的發送者和接受者。
  • 在Activity、Fragment和線程中表現良好。
  • 避免了複雜的和易錯的依賴關係和生命周期問題。
  • 使得代碼更簡潔,性能更好。
  • 更快,更小(約50k的jar包)。

三、Demo案例分享及問題解決

       下麵用一個簡單的例子介紹一下EventBus的使用,這個例子實現的功能是:有界面1、界面2、兩個界面,界面1跳轉到界面2,界面2返回界面1時,帶回一個參數,並且在界面1中以Toast方式展現。

 

  1.   添加依賴:在項目app包下的bulid.grade中添加:implementation 'org.greenrobot:eventbus:3.1.1'

        

 

 

       

        2.  定義事件:定義一個事件的封裝對象。在程式內部就使用該對象作為通信的信息:    

public class FirstEvent {

    private String strMsg;

    public FirstEvent(String strMsg) {
        this.strMsg = strMsg;
    }

    public String getStrMsg() {
        return strMsg;
    }
}

      

         3.  註冊EventBus : 我們要在接受消息的界面註冊EventBus,界面1負責接受消息,我們將註冊EventBus的代碼放到界面1,(在onDestory中反註冊)註冊代碼:

        

 

        這裡一定要註意:EventBus.getDefult().resgister(this);一定要在一個public方法內,而且方法前邊一定加上註解:@Subscribe,否則會報錯:org.greenrobot.eventbus.EventBusException:

         

 

         4. 發送消息:使用EventBus中的Post方法來實現發送的,發送過去的是我們新建的類的實例(即第二步定義事件的實體類FirstEvent),發送消息在界面2,鎖一在界面2中添加代碼:

         

         註意:紅框部分一定加上,否則代碼無效

 

        5. 接收消息:在界面1中接收界面2返回的消息,需要在界面1中添加代碼:

        

 

 

       完整代碼如下:界面1的xml文件和java文件:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <TextView
        android:id="@+id/tv_maintext"
        android:text="小朋友  你是否有很多的問號?"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"/>
    <Button
        android:id="@+id/btn_mainbtn"
        android:layout_width="match_parent"
        android:text="主界面"
        android:layout_height="wrap_content"/>

</LinearLayout>
package com.cyf.mytestdemo;

import androidx.appcompat.app.AppCompatActivity;

import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;

import org.greenrobot.eventbus.EventBus;
import org.greenrobot.eventbus.Subscribe;
import org.greenrobot.eventbus.ThreadMode;

public class MainActivity extends AppCompatActivity {

    private Button btn_main;
    private TextView tv_maintext;

    @Subscribe
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        //註冊該頁面為訂閱者
        EventBus.getDefault().register(this);

        btn_main=findViewById(R.id.btn_mainbtn);
        tv_maintext=findViewById(R.id.tv_maintext);

        btn_main.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                Intent intent=new Intent(MainActivity.this,SecondActivity.class);
                startActivity(intent);

            }
        });


    }

    @Subscribe(threadMode = ThreadMode.MAIN)
    public void onEventMainThread(FirstEvent event){
        Log.e("-----", "___________________________"+event.getStrMsg());
        Toast.makeText(this,event.getStrMsg(),Toast.LENGTH_SHORT).show();
    }





    @Override
    protected void onDestroy() {
        super.onDestroy();

        //反註冊
        EventBus.getDefault().unregister(this);
    }
}

        界面2的xml和java文件:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".SecondActivity">

    <Button
        android:id="@+id/btn_second"
        android:text="!!!!!"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"/>

</LinearLayout>
package com.cyf.mytestdemo;

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import android.view.View;
import android.widget.Button;

import org.greenrobot.eventbus.EventBus;

public class SecondActivity extends AppCompatActivity {

    private Button btn_second;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_second);

        btn_second=findViewById(R.id.btn_second);

        btn_second.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                EventBus.getDefault().post(new FirstEvent("我只有感嘆號"));
                finish();

            }
        });
    }
}

 

 

 

 

      


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 本文更新於2019-08-18,使用MySQL 5.7,操作系統為Deepin 15.4。 優化SQL語句的步驟 通過SHOW STATUS瞭解SQL語句的執行情況 操作的計數,是對執行次數進行計數,不論提交還是回滾都會累加。 Com_xxx形式的參數表示每個xxx語句執行的次數,對所有的存儲引擎都 ...
  • 數據表中有一列數據,如圖1所示: 圖1數據表 現在需要將該列數據分成三列。 SQL 代碼如下所示: 1、 select max(case when F1%3=1 then F1 else 0 end) a,max(case when F1%3=2 then F1 else 0 end) b,max( ...
  • DruidDataSource配置相容DBCP,但個別配置的語意有所區別。 配置 預設值 說明 name 配置這個屬性的意義在於,如果存在多個數據源,監控的時候可以通過名字來區分開來。如果沒有配置,將會生成一個名字,格式是:"DataSource-" + System.identityHashCod ...
  • mongodb的安裝非常簡單,官網有提供安裝版和綠色版的下載(外網,速度慢的一批,網速跟不上的同志建議從其他渠道下載),我本地裝的是安裝版的,目錄為預設目錄。再此不細聊如何安裝,直接進入主題,首先是如何啟動。 啟動步驟:方法1:命令行參數方式啟動服務 1.在mongodb安裝目錄下,與bin同級的目 ...
  • 一、InnoDB 體系架構 InnoDB 存儲引擎有多個記憶體塊,可以認為這些記憶體塊組成了一個大的記憶體池,負責如下工作: 維護所有進程/線程需要訪問的多個內部數據結構。 緩存磁碟上的數據,方便快速的讀取,同時對磁碟文件的數據修改之前在這裡進行緩存。 重做日誌(redo log)緩衝。 後臺線程的主要作 ...
  • 1 #標識列 2 /* 3 又稱為自增長列 4 含義:可以不用手動的插入值,系統提供預設的序列值 5 6 7 特點: 8 1、標識列必須和主鍵搭配嗎?不一定,但要求是一個key 9 2、一個表可以有幾個標識列?至多一個! 10 3、標識列的類型只能是數值型 11 4、標識列可以通過 SET auto ...
  • 1 #常見約束 2 3 /* 4 5 6 含義:一種限制,用於限製表中的數據,為了保證表中的數據的準確和可靠性 7 8 9 分類:六大約束 10 NOT NULL:非空,用於保證該欄位的值不能為空 11 比如姓名、學號等 12 DEFAULT:預設,用於保證該欄位有預設值 13 比如性別 14 PR ...
  • 本文更新於2020-04-05,使用MySQL 5.7,操作系統為Deepin 15.4。 安裝 MySQL Utilities需單獨安裝,如使用apt-get命令: apt-get install mysql-utilities 分類 MySQL工具根據用途可以分為如下幾類: 審計日誌管理:mys ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...