天天看點

EventBus3.0的使用1.EventBus3.0的特點:2.EventBus3.0的下載下傳位址:3.EventBus3.0的基本使用

版權聲明:本文為部落客原創文章,未經部落客允許不得轉載。 https://blog.csdn.net/u010046908/article/details/50951999

EventBus是Android的釋出/訂閱事件總線優化。主要功能是替代在Android四大元件Activity,Service,Intent,Handler,BroadCast線程之間傳遞消息,優點是開銷小,代碼更優雅。以及将發送者和接收者解耦。

1.EventBus3.0的特點:

  1. 簡化了元件之間的通信
  2. 将事件發送方和接收方執行與Activities, Fragments和背景線程,避免了複雜的和容易出錯的依賴性和生命周期問題
  3. 包的體積很小(~ 50 k jar),
  4. 、擁有先進的功能,如傳遞線程,使用者優先級等。

2.EventBus3.0的下載下傳位址:

https://github.com/greenrobot/EventBus

3.EventBus3.0的基本使用

在EventBus中,擷取執行個體的方法一般是采用EventBus.getDefault()來擷取預設的EventBus執行個體。

EventBus mEventBus = Event.getDefault();

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

public class SimpleEventType {

public SimpleEventType(){}

}

(3.2)在要接收消息的頁面注冊:

mEventBus.register(this);

(3.3)發送消息

mEventBus.post(new SimpleEventType event);

(3.4)接受消息的頁面實作(共有四個枚舉類型注解,各功能不同,這是其中之一,可以選擇性的實作,這裡先實作一個在主線程的):

@Subscribe(threadMode = ThreadMode.MAIN)//在主線程

public void onEvent(SimpleEventType event) {}

(3.5)解除注冊

mEventBus.unregister(this);

EventBus的執行順序就是這樣的。

下面是一個EventBus使用的簡單例子:

描述:點選一個Button跳轉界面。第二個頁面的button點選後向第一個界面發送消息,第一個界面更新text值。

案例的代碼:

package com.lidong.demo.eventbus.event;

/**
 * Created by lidong on 2016/3/21.
 */
public class SimpleEvent {

private String mMsg;

public SimpleEvent(String msg) {
mMsg = msg;
}
public String getMsg(){
return mMsg;
}
}

`package com.lidong.demo.eventbus;

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

import com.lidong.demo.R;
import com.lidong.demo.eventbus.event.SimpleEvent;

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

import butterknife.Bind;
import butterknife.ButterKnife;
import butterknife.OnClick;

public class EventBusDemo1Activity extends AppCompatActivity {

@Bind(R.id.toolbar)
Toolbar toolbar;
@Bind(R.id.btn_open_page1)
Button btnOpenPage1;
@Bind(R.id.tv_display)
TextView tvDisplay;
private String TAG = EventBusDemo1Activity.class.getSimpleName();

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_event_bus_demo1);
    ButterKnife.bind(this);
    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
    setSupportActionBar(toolbar);
    ButterKnife.bind(this);

    //注冊EventBus
    EventBus.getDefault().register(this);
}

@OnClick({R.id.btn_open_page1})
public void onClick(View v){
    switch (v.getId()){
        case R.id.btn_open_page1:
            startActivity(new Intent(EventBusDemo1Activity.this,EventBusDemo2Activity.class));
            break;
    }
}
@Subscribe()
public void onEventMainThread(SimpleEvent event) {

    String msg = "onEventMainThread收到了消息:" + event.getMsg();
    Log.d(TAG, msg);
    tvDisplay.setText(msg);
    Toast.makeText(this, msg, Toast.LENGTH_LONG).show();
}

@Override
protected void onDestroy(){
    super.onDestroy();
    EventBus.getDefault().unregister(this);//解除EventBus
}
}
           

`

package com.lidong.demo.eventbus;

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.view.View;
import android.widget.Button;

import com.lidong.demo.R;
import com.lidong.demo.eventbus.event.SimpleEvent;

import org.greenrobot.eventbus.EventBus;

import butterknife.Bind;
import butterknife.ButterKnife;
import butterknife.OnClick;

public class EventBusDemo2Activity extends AppCompatActivity {

@Bind(R.id.toolbar)
Toolbar toolbar;
@Bind(R.id.btn_click_send_message)
Button btnClickSendMessage;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_event_bus_demo2);
    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
    setSupportActionBar(toolbar);
    ButterKnife.bind(this);
}

@OnClick({R.id.btn_click_send_message})
public void onClick(View v){
    switch (v.getId()){
        case R.id.btn_click_send_message:
            EventBus.getDefault().post(
                    new SimpleEvent("你好,EventBus!"));
            break;
    }
}


}
           

`

就這兩個重要的類,就已經實作了界面之間的通信。

EventBus的消息發送

` EventBus.getDefault().post(
                    new SimpleEvent("你好,EventBus!"));`
           

EventBus的消息接收

在EventBus中使用中,假如有三個事件發送到一個頁面,如何接收呢?則是通過事件的執行個體來差別的。

public class SimpleEvent1 {

private String mMsg;

public SimpleEvent1(String msg) {
mMsg = msg;
}
public String getMsg(){
return mMsg;
}
}
public class SimpleEvent2 {

private String mMsg;

public SimpleEvent2(String msg) {
mMsg = msg;
}
public String getMsg(){
return mMsg;
}
}
public class SimpleEvent3 {

private String mMsg;

public SimpleEvent3(String msg) {
mMsg = msg;
}
public String getMsg(){
return mMsg;
}
}


EventBus.getDefault().post(
new SimpleEvent1("你好,EventBus1!"));break;
   EventBus.getDefault().post(
new SimpleEvent2("你好,EventBus2!"));break;
   EventBus.getDefault().post(
new SimpleEvent3("你好,EventBus3!"));break;
           

四種不同優先級的事件處理(注解)

@Subscribe(threadMode = ThreadMode.MAIN)//在主線程
public void onEventUse(SimpleEvent event) {
    Log.d(TAG, "onEventMainThread收到了消息:" + event.getMsg());
}

@Subscribe(threadMode = ThreadMode.MAIN)//在主線程
public void onEventUse(SimpleEvent2 event) {

    Log.d(TAG, "onEventMainThread收到了消息:" + event.getMsg());
}
@Subscribe(threadMode = ThreadMode.BACKGROUND)//在背景線程
public void onEventUse(SimpleEvent3 event){
    Log.d(TAG, "onEventBackground收到了消息:" + event.getMsg());
}
@Subscribe(threadMode = ThreadMode.ASYNC)//強制在背景線程執行
public void onEventUseAsync(SimpleEvent2 event){
    Log.d(TAG, "onEventAsync收到了消息:" + event.getMsg());
}
@Subscribe(threadMode = ThreadMode.POSTING)//預設方式, 在發送線程執行
public void onEventUser(SimpleEvent3 event) {
    Log.d(TAG, "OnEvent收到了消息:" + event.getMsg());
}
           

也就是這樣,要說明的問題是消息接收的參數是由事件的執行個體來決定的。

代碼位址
EventBus3.0的使用1.EventBus3.0的特點:2.EventBus3.0的下載下傳位址:3.EventBus3.0的基本使用

繼續閱讀