在進行項目開發的過程中,我們往往需要應用程序的各個組件,線程之間進行通信,比如子線程中進行請求數據,當數據請求完畢之後,通過Handler或者廣播的方式通知UI更新,或者一個Activity中包含兩個Fragment,當Activity進行一些操作的餓時候可以通知Fragment進行更新數據。當我們的項目越來越複雜的時候,我們所使用的Intent,Handler,廣播就會非常多,然後我們管理起來非常不方便,這樣就催生了EventBust的產生。目前使用的EventBus版本是3.0(官方已經更新到了3.1.1).
定義
EventBus就是能夠簡化組件之間通信,讓我們的代碼書寫變得更加簡單,能夠有效的分離事件發送方和接收方,更夠避免複雜和容易出錯的依賴性和生命週期問題的框架
關於EventBus
要素
- Event 事件,可以是任意類型
- Subscribe() 事件訂閱者,或者說是事件接受者。在EventBus3之前,使用的時候,我們必須定義以onEvent開頭的那幾個方法,onEvent,onEventMainThread,onEventBackgroundThread和onEventAsync。但是在EventBus3之後我們處理事件的方法名可以隨意取,只要加上響應的註解@subscribe()即可,並且指定了線程模型是POSTING
- Publisher 事件發佈者,就是事件是由他發佈的,他通知別人去做什麼事情。我們可以在任意地方發佈事件,一般情況下,使用EventBus.getDefault()就可以得到一個EventBus對象,然後調用post(object)方法即可
四種線程模型
- POSTING(默認) 表示事件處理函數的線程跟發佈事件的線程是同一個線程(不管之前發佈的消息的事主線程還是子線程,都使用發佈事件對象所處的線程)
- MAIN 表示事件處理函數的線程是主線程,也就是UI線程,如果我們需要執行UI更新,則需要適用這樣的方式,但是注意不能執行耗時操作
- BACKGOUND 表示事件處理函數的線程在後臺線程,因此不能執行UI操作,如果發佈時間的線程就是主線程,那麼事件處理函數將會開啓一個子線程,如果發佈事件的線程就是子線程,那麼事件處理的線程就直接使用該線程
- 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的簡單實現,所以暫時先說到這裏