1. 程式人生 > 實用技巧 >Android —— EventBus使用簡介

Android —— EventBus使用簡介

參考部落格: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();

            }
        });
    }
}