重拾Android之路(十五)EventBus

在進行項目開發的過程中,我們往往需要應用程序的各個組件,線程之間進行通信,比如子線程中進行請求數據,當數據請求完畢之後,通過Handler或者廣播的方式通知UI更新,或者一個Activity中包含兩個Fragment,當Activity進行一些操作的餓時候可以通知Fragment進行更新數據。當我們的項目越來越複雜的時候,我們所使用的Intent,Handler,廣播就會非常多,然後我們管理起來非常不方便,這樣就催生了EventBust的產生。目前使用的EventBus版本是3.0(官方已經更新到了3.1.1).

定義

EventBus就是能夠簡化組件之間通信,讓我們的代碼書寫變得更加簡單,能夠有效的分離事件發送方和接收方,更夠避免複雜和容易出錯的依賴性和生命週期問題的框架

關於EventBus

要素

  1. Event 事件,可以是任意類型
  2. Subscribe() 事件訂閱者,或者說是事件接受者。在EventBus3之前,使用的時候,我們必須定義以onEvent開頭的那幾個方法,onEvent,onEventMainThread,onEventBackgroundThread和onEventAsync。但是在EventBus3之後我們處理事件的方法名可以隨意取,只要加上響應的註解@subscribe()即可,並且指定了線程模型是POSTING
  3. Publisher 事件發佈者,就是事件是由他發佈的,他通知別人去做什麼事情。我們可以在任意地方發佈事件,一般情況下,使用EventBus.getDefault()就可以得到一個EventBus對象,然後調用post(object)方法即可

四種線程模型

  1. POSTING(默認) 表示事件處理函數的線程跟發佈事件的線程是同一個線程(不管之前發佈的消息的事主線程還是子線程,都使用發佈事件對象所處的線程)
  2. MAIN 表示事件處理函數的線程是主線程,也就是UI線程,如果我們需要執行UI更新,則需要適用這樣的方式,但是注意不能執行耗時操作
  3. BACKGOUND 表示事件處理函數的線程在後臺線程,因此不能執行UI操作,如果發佈時間的線程就是主線程,那麼事件處理函數將會開啓一個子線程,如果發佈事件的線程就是子線程,那麼事件處理的線程就直接使用該線程
  4. ASYNC 表示無論時間發佈的線程是哪一個,都會創建一個新的線程,這樣我們是不能更新UI的

基本用法

這裏我們舉個例子,我們需要在一個Activity鍾註冊EventBus時間,然後定義接收方法,這有點像廣播。所以我們的步驟如下
1. 定義一個事件類 表示我們當前需要傳遞的數據類型
2. 註冊事件 表示當前的Activity需要監聽某一個事件,如果事件發生了,則需要執行相依的操作,所以一般我們會在onCreate方法中註冊事件
3. 解除事件 一般會在onDestroy方法中
4. 發送事件
5. 處理事件

一個例子

引入依賴

 compile 'org.greenrobot:eventbus:3.1.1'

定義一個事件類,比如這裏我們需要發送一個學生對象

package c.niupule.eventbus_demo;

/**
 * Created: niupule
 * Date: 2018/4/12  下午8:49
 * E-mail:[email protected]
 * des:
 */

public class Student {

    private int stu_id;
    private String stu_name;
    private String stu_school;
    private int stu_age;

    public Student() {
    }

    public Student(int stu_id, String stu_name, String stu_school, int stu_age) {

        this.stu_id = stu_id;
        this.stu_name = stu_name;
        this.stu_school = stu_school;
        this.stu_age = stu_age;
    }

    public int getStu_id() {
        return stu_id;
    }

    public void setStu_id(int stu_id) {
        this.stu_id = stu_id;
    }

    public String getStu_name() {
        return stu_name;
    }

    public void setStu_name(String stu_name) {
        this.stu_name = stu_name;
    }

    public String getStu_school() {
        return stu_school;
    }

    public void setStu_school(String stu_school) {
        this.stu_school = stu_school;
    }

    public int getStu_age() {
        return stu_age;
    }

    public void setStu_age(int stu_age) {
        this.stu_age = stu_age;
    }

    @Override
    public String toString() {
        return "Student{" +
                "stu_id=" + stu_id +
                ", stu_name='" + stu_name + '\'' +
                ", stu_school='" + stu_school + '\'' +
                ", stu_age=" + stu_age +
                '}';
    }
}

接着在onDestroy方法和onCreate方法中分別註冊和解除事件對象

package c.niupule.eventbus_demo;

import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;

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

public class MainActivity extends AppCompatActivity {

    private TextView textView;
    private Button btn;

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

        EventBus.getDefault().register(this);

        textView = findViewById(R.id.text);

        btn = findViewById(R.id.btn);

        btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                startActivity(new Intent(MainActivity.this,SecondActivity.class));
            }
        });

    }

    @Subscribe(threadMode = ThreadMode.MAIN)
    public void getText(Student ss){
        textView.setText(ss.toString());
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        if(EventBus.getDefault().isRegistered(this)){
            EventBus.getDefault().unregister(this);
        }
    }
}

事件處理,這裏由於我們處理的是主線程中的數據,所以直接發送消息就可以了,在第二個Activity中發送消息

package c.niupule.eventbus_demo;

import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v7.app.AppCompatActivity;
import android.view.View;

import org.greenrobot.eventbus.EventBus;

/**
 * Created: niupule
 * Date: 2018/4/12  下午8:58
 * E-mail:[email protected]
 * des:
 */

public class SecondActivity extends AppCompatActivity{

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

        findViewById(R.id.btn2).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                EventBus.getDefault().post(new Student(100,"張三","北京大學",22));
                finish();
            }
        });

    }
}

之後就可以實現了。

總結

這裏只是簡單的實現EventBus的簡單實現,所以暫時先說到這裏

發佈了53 篇原創文章 · 獲贊 8 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章