前言:EventBus是上週項目中用到的,網上的文章大都一樣,或者過時,有用的沒幾篇,經過琢磨,請教他人,也終於弄清楚點眉目,記錄下來分享給大家。
相關文章:
1、《EventBus使用詳解(一)——初步使用EventBus》
2、《EventBus使用詳解(二)——EventBus使用進階》
一、概述
EventBus是一款針對Android優化的發佈/訂閱事件總線。主要功能是替代Intent,Handler,BroadCast在Fragment,Activity,Service,線程之間傳遞消息.優點是開銷小,代碼更優雅。以及將發送者和接收者解耦。
1、下載EventBus的類庫
源碼:https://github.com/greenrobot/EventBus
2、基本使用
(1)自定義一個類,可以是空類,比如:
-
public class AnyEventType {
-
public AnyEventType(){}
-
}
(2)在要接收消息的頁面註冊:
(3)發送消息
-
eventBus.post(new AnyEventType event);
(4)接受消息的頁面實現(共有四個函數,各功能不同,這是其中之一,可以選擇性的實現,這裏先實現一個):
-
public void onEvent(AnyEventType event) {}
(5)解除註冊
-
eventBus.unregister(this);
順序就是這麼個順序,可真正讓自己寫,估計還是雲裏霧裏的,下面舉個例子來說明下。
首先,在EventBus中,獲取實例的方法一般是採用EventBus.getInstance()來獲取默認的EventBus實例,當然你也可以new一個又一個,個人感覺還是用默認的比較好,以防出錯。
二、實戰
先給大家看個例子:
當擊btn_try按鈕的時候,跳到第二個Activity,當點擊第二個activity上面的First Event按鈕的時候向第一個Activity發送消息,當第一個Activity收到消息後,一方面將消息Toast顯示,一方面放入textView中顯示。
按照下面的步驟,下面來建這個工程:
1、基本框架搭建
想必大家從一個Activity跳轉到第二個Activity的程序應該都會寫,這裏先稍稍把兩個Activity跳轉的代碼建起來。後面再添加EventBus相關的玩意。
MainActivity佈局(activity_main.xml)
-
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
-
xmlns:tools="http://schemas.android.com/tools"
-
android:layout_width="match_parent"
-
android:layout_height="match_parent"
-
android:orientation="vertical">
-
-
<Button
-
android:id="@+id/btn_try"
-
android:layout_width="match_parent"
-
android:layout_height="wrap_content"
-
android:text="btn_bty"/>
-
<TextView
-
android:id="@+id/tv"
-
android:layout_width="wrap_content"
-
android:layout_height="match_parent"/>
-
-
</LinearLayout>
新建一個Activity,SecondActivity佈局(activity_second.xml)
-
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
-
xmlns:tools="http://schemas.android.com/tools"
-
android:layout_width="match_parent"
-
android:layout_height="match_parent"
-
android:orientation="vertical"
-
tools:context="com.harvic.try_eventbus_1.SecondActivity" >
-
-
<Button
-
android:id="@+id/btn_first_event"
-
android:layout_width="match_parent"
-
android:layout_height="wrap_content"
-
android:text="First Event"/>
-
-
</LinearLayout>
MainActivity.java (點擊btn跳轉到第二個Activity)
-
public class MainActivity extends Activity {
-
-
Button btn;
-
-
@Override
-
protected void onCreate(Bundle savedInstanceState) {
-
super.onCreate(savedInstanceState);
-
setContentView(R.layout.activity_main);
-
-
btn = (Button) findViewById(R.id.btn_try);
-
-
btn.setOnClickListener(new View.OnClickListener() {
-
-
@Override
-
public void onClick(View v) {
-
-
Intent intent = new Intent(getApplicationContext(),
-
SecondActivity.class);
-
startActivity(intent);
-
}
-
});
-
}
-
-
}
到這,基本框架就搭完了,下面開始按步驟使用EventBus了。
2、新建一個類FirstEvent
-
package com.harvic.other;
-
-
public class FirstEvent {
-
-
private String mMsg;
-
public FirstEvent(String msg) {
-
-
mMsg = msg;
-
}
-
public String getMsg(){
-
return mMsg;
-
}
-
}
這個類很簡單,構造時傳進去一個字符串,然後可以通過getMsg()獲取出來。
3、在要接收消息的頁面註冊EventBus:
在上面的GIF圖片的演示中,大家也可以看到,我們是要在MainActivity中接收發過來的消息的,所以我們在MainActivity中註冊消息。
通過我們會在OnCreate()函數中註冊EventBus,在OnDestroy()函數中反註冊。所以整體的註冊與反註冊的代碼如下:
-
package com.example.tryeventbus_simple;
-
-
import com.harvic.other.FirstEvent;
-
-
import de.greenrobot.event.EventBus;
-
import android.app.Activity;
-
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;
-
-
public class MainActivity extends Activity {
-
-
Button btn;
-
TextView tv;
-
-
@Override
-
protected void onCreate(Bundle savedInstanceState) {
-
super.onCreate(savedInstanceState);
-
setContentView(R.layout.activity_main);
-
-
EventBus.getDefault().register(this);
-
-
btn = (Button) findViewById(R.id.btn_try);
-
tv = (TextView)findViewById(R.id.tv);
-
-
btn.setOnClickListener(new View.OnClickListener() {
-
-
@Override
-
public void onClick(View v) {
-
-
Intent intent = new Intent(getApplicationContext(),
-
SecondActivity.class);
-
startActivity(intent);
-
}
-
});
-
}
-
@Override
-
protected void onDestroy(){
-
super.onDestroy();
-
EventBus.getDefault().unregister(this);
-
}
-
}
4、發送消息
發送消息是使用EventBus中的Post方法來實現發送的,發送過去的是我們新建的類的實例!
-
EventBus.getDefault().post(new FirstEvent("FirstEvent btn clicked"));
完整的SecondActivity.Java的代碼如下:
-
package com.example.tryeventbus_simple;
-
-
import com.harvic.other.FirstEvent;
-
-
import de.greenrobot.event.EventBus;
-
import android.app.Activity;
-
import android.os.Bundle;
-
import android.view.View;
-
import android.widget.Button;
-
-
public class SecondActivity extends Activity {
-
private Button btn_FirstEvent;
-
-
@Override
-
protected void onCreate(Bundle savedInstanceState) {
-
super.onCreate(savedInstanceState);
-
setContentView(R.layout.activity_second);
-
btn_FirstEvent = (Button) findViewById(R.id.btn_first_event);
-
-
btn_FirstEvent.setOnClickListener(new View.OnClickListener() {
-
-
@Override
-
public void onClick(View v) {
-
-
EventBus.getDefault().post(
-
new FirstEvent("FirstEvent btn clicked"));
-
}
-
});
-
}
-
}
5、接收消息
接收消息時,我們使用EventBus中最常用的onEventMainThread()函數來接收消息,具體爲什麼用這個,我們下篇再講,這裏先給大家一個初步認識,要先能把EventBus用起來先。
在MainActivity中重寫onEventMainThread(FirstEvent event),參數就是我們自己定義的類:
在收到Event實例後,我們將其中攜帶的消息取出,一方面Toast出去,一方面傳到TextView中;
-
public void onEventMainThread(FirstEvent event) {
-
-
String msg = "onEventMainThread收到了消息:" + event.getMsg();
-
Log.d("harvic", msg);
-
tv.setText(msg);
-
Toast.makeText(this, msg, Toast.LENGTH_LONG).show();
-
}
完整的MainActiviy代碼如下:
-
package com.example.tryeventbus_simple;
-
-
import com.harvic.other.FirstEvent;
-
-
import de.greenrobot.event.EventBus;
-
import android.app.Activity;
-
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;
-
-
public class MainActivity extends Activity {
-
-
Button btn;
-
TextView tv;
-
-
@Override
-
protected void onCreate(Bundle savedInstanceState) {
-
super.onCreate(savedInstanceState);
-
setContentView(R.layout.activity_main);
-
-
EventBus.getDefault().register(this);
-
-
btn = (Button) findViewById(R.id.btn_try);
-
tv = (TextView)findViewById(R.id.tv);
-
-
btn.setOnClickListener(new View.OnClickListener() {
-
-
@Override
-
public void onClick(View v) {
-
-
Intent intent = new Intent(getApplicationContext(),
-
SecondActivity.class);
-
startActivity(intent);
-
}
-
});
-
}
-
-
public void onEventMainThread(FirstEvent event) {
-
-
String msg = "onEventMainThread收到了消息:" + event.getMsg();
-
Log.d("harvic", msg);
-
tv.setText(msg);
-
Toast.makeText(this, msg, Toast.LENGTH_LONG).show();
-
}
-
-
@Override
-
protected void onDestroy(){
-
super.onDestroy();
-
EventBus.getDefault().unregister(this);
-
}
-
}
好了,到這,基本上算初步把EventBus用起來了,下篇再講講EventBus的幾個函數,及各個函數間是如何識別當前如何調用哪個函數的。