【攻克Android (35)】EventBus事件总线分发库

[b][size=large]本文围绕以下六个部分展开:[/size][/b]

[b][size=large]一、事件总线管理[/size][/b]
[b][size=large]二、EventBus[/size][/b]
[b][size=large]三、EventBus与BroadcastReceiver的区别[/size][/b]
[b][size=large]案例一[/size][/b]
[b][size=large]案例二:一处点击发送数据,另一处或多处注册点可以及时获取更新传输过来的数据[/size][/b]
[b][size=large]案例三:Activity和Service之间互相发布与接收事件[/size][/b]


[b][size=large]一、事件总线管理[/size][/b]

[size=medium]将事件放入队列里,用于管理和分发。[/size]

[size=medium](1)保证应用的各个部分之间高效的通信及数据、事件分发。[/size]

[size=medium](2)模块间解耦:通过事件的分发,可以让各个模块间关联程序变小。[/size]

[size=medium]当在开发一些庞大的的项目时,模块比较多,这个时候为了避免耦合度和保证 APP 的效率,会用到 EventBus 等类似的事件总线处理模型。这样可以简化一些数据传输操作,保证APP的简洁,做到高内聚、低耦合。[/size]


[b][size=large]二、EventBus[/size][/b]

[size=medium][b]1. 概念[/b][/size]

[size=medium]EventBus是一个发布/订阅的事件总线。它可以让两个组件相互通信,但是它们之间并不相互知晓。[/size]

[size=medium]EventBus模式,也被称为 Message Bus模式,或者 发布者/订阅者(publisher/subscriber)模式。[/size]

[size=medium]事件响应有更多的线程选择,EventBus 可以向不同的线程中发布事件。[/size]

[size=medium]EventBus 支持 Sticky Event。[/size]

[align=center][img]http://dl2.iteye.com/upload/attachment/0110/9930/103c67fe-3a3b-3eb3-840a-e611aa888f69.png[/img][/align]

[size=medium][b]2. 有3个主要的元素:[/b][/size]

[size=medium](1)Event:事件。[/size]

[size=medium]Event可以是任意类型的对象。[/size]

[size=medium](2)Subscriber:事件订阅者,接收特定的事件。[/size]

[size=medium]在EventBus中,使用约定来指定事件订阅者以简化使用。即,所有事件订阅都是以onEvent开头的函数。具体来说,函数的名字是onEventMainThread,onEventPostThread,onEventBackgroundThread,onEventAsync这四个,onEvent是默认的接收数据处理的方法。这四个事件订阅函数,每个都与一个“ThreadMode”相关联,ThreadMode指定了会调用的函数。有以下4个ThreadMode:[/size]

[size=medium]1)PostThread:事件的处理和事件的发送在相同的进程。[/size]

[size=medium]事件处理时间不应太长,不然影响事件的发送线程,而这个线程可能是UI线程。对应的函数名是onEvent。[/size]

[size=medium]2)MainThread:事件的处理会在UI线程中执行。[/size]

[size=medium]事件处理时间不应太长,长了会ANR的。对应的函数名是onEventMainThread。[/size]

[size=medium]3)BackgroundThread:事件的处理会在一个后台线程中执行。[/size]

[size=medium]虽然事件处理是在后台线程,但事件处理时间还是不应该太长,因为如果发送事件的线程是后台线程,会直接执行事件。如果当前线程是UI线程,事件会被加到一个队列中,由一个线程依次处理这些事件,如果某个事件处理时间太长,会阻塞后面的事件的派发或处理。对应的函数名是onEventBackgroundThread。[/size]

[size=medium]4)AsyncThread:事件处理会在单独的线程中执行。[/size]

[size=medium]主要用于在后台线程中执行耗时操作,每个事件会开启一个线程(有线程池),但最好限制线程的数目。[/size]

[size=medium][b]根据事件订阅的函数名称的不同,会使用不同的ThreadMode。比如在后台线程加载了数据想在UI线程显示,订阅者只需把函数命名为onEventMainThread。[/b][/size]

[size=medium][b]3. 基本用法[/b][/size]

[size=medium]分 [b]注册[/b]、[b]订阅[/b]、[b]发布[/b]、[b]注销注册[/b] 等步骤。使用时需先注册、订阅,然后向订阅者发布消息数据即可。[/size]

[size=medium](1)注册(3个构造方法):[/size]

[size=medium]EventBus.getDefault().register(this);[/size]

[size=medium]EventBus.getDefault().register(new MyClass());[/size]

[size=medium]// 注册三个参数分别是:消息订阅者(接收者),接收方法名,事件类。[/size] [size=medium]EventBus.getDefault().register(this,"setTextA",SetTextAEvent.class);[/size]

[size=medium](2)注销注册:[/size]

[size=medium]EventBus.getDefault().unregister(this);[/size]

[size=medium]EventBus.getDefault().unregister(new MyClass());[/size]

[size=medium](3)定义事件类型:[/size]

[size=medium]public class MyEvent {}[/size]

[size=medium](4)订阅处理数据:[/size]

[size=medium]public void onEvent(AnyEventType event){}:默认的接收数据处理的方法[/size]

[size=medium]public void onEventMainThread{}[/size]

[size=medium]onEventPostThread[/size]

[size=medium]onEventBackgroundThread[/size]

[size=medium]onEventAsync[/size]

[size=medium](5)发布:[/size]

[size=medium]EventBus.getDefault().postSticky(new SecondActivityEvent("Message from SecondActivity"));[/size]

[size=medium]EventBus.getDefault().post(new ChangeImgEvent(1));[/size]


[b][size=large]三、EventBus与BroadcastReceiver的区别[/size][/b]

[size=medium][b]1. 二者类似。[/b][/size]

[size=medium]在Android中广播分为两个方面:广播发送者和广播接收者,通常情况下,BroadcastReceiver指的就是广播接收者(广播接收器)。[/size]

[size=medium]广播:在一个地方注册广播,在另一个地方针对action发送广播、传递数据,对应注册的地方就可以收到广播。[/size]

[size=medium]EventBus:基于订阅/发布的模式。在需要接收数据的地方,进行注册与订阅,在需要发布数据的地方发布,则在注册的地方就可以收到了。[/size]

[size=medium]简单点说,就是两人约定好怎么通信,一人发布消息,另外一个约定好的人立马接收到你发的消息。EventBus就可以帮助减少做很多事,不管你在任何地方任何位置发布一个事件,接收者都能立马接收到你的消息,不用你考虑android子线程操作UI线程的问题。[/size]

[size=medium][b]2. 二者区别。[/b][/size]

[size=medium](1)EventBus 有三个主要的元素:事件、订阅和发布。广播两个元素:订阅和发布,但是广播是针对整个App而言的。[/size]

[size=medium](2)BroadcastReceiver是组件,需要在功能清单中注册。而EventBus 不需要注册。[/size]

[size=medium](3)BroadcastReceiver只能做一件事情,而EventBus多事件处理比较好。[/size]

[size=medium](4)在不同场景中的适用性:[/size]

[size=medium]1)同一App内部的同一组件内的消息通信(单个或多个线程之间),实际应用中肯定是不会用到广播机制的(虽然可以用),无论是使用扩展变量作用域、基于接口的回调还是Handler-post/Handler-Message等方式,都可以直接处理此类问题,若使用广播机制,显然有些“杀鸡牛刀”的感觉。[/size]

[size=medium]2)同一app内部的不同组件之间的消息通信(单个进程),对于此类需求,在有些教复杂的情况下单纯的依靠基于接口的回调等方式不好处理,此时可以直接使用EventBus等,相对而言,EventBus由于是针对同一进程,用于处理此类需求非常适合,且轻松。[/size]

[size=medium]3)其他情形,由于涉及不同进程间的消息通信,此时根据实际业务使用广播机制会显得非常适宜。[/size]


[b][size=large]案例一[/size][/b]

[size=medium]MainActivity[/size]

public class MainActivity extends Activity {

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

// 1. 注册
EventBus.getDefault().register(this);
}

/**
* 3. 发送数据消息事件
*/
private void postData() {
String string = "我是消息";
EventBus.getDefault().post(string);
}

/**
* 2. 接收数据消息事件
*/
public void onEvent(String string) {

}

public void onEventMainThread(String string) {

}

public void onEventPostThread(String string) {

}

public void onEventBackgroundThread(String string) {

}

public void onEventAsync(String string) {

}


@Override
protected void onDestroy() {
super.onDestroy();
// 4. 取消注册
EventBus.getDefault().unregister(this);
}

}



[b][size=large]案例二:一处点击发送数据,另一处或多处注册点可以及时获取更新传输过来的数据[/size][/b]


[size=medium]1. activity_main.xml。写一个按钮和一个文本框。[/size]

<RelativeLayout 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:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context=".MainActivity">

<Button
android:id="@+id/btnSend"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="发送事件"/>

<TextView
android:id="@+id/tvContent"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@id/btnSend"
android:gravity="center"
android:textSize="20sp"/>

</RelativeLayout>


[size=medium]2. MainActivity。声明和初始化两个控件。[/size]

    private TextView tvContent;
private Button btnSend;


        tvContent = (TextView) findViewById(R.id.tvContent);
btnSend = (Button) findViewById(R.id.btnSend);



[size=medium]3. MainActivity。onCreate()方法中注册。[/size]

EventBus.getDefault().register(this);


[size=medium]4. MainActivity。onDestroy()方法中取消注册。[/size]

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


[size=medium]5. MainActivity。通过事件监听器设置按钮的点击事件。[/size]

        btnSend.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {

}
});


[size=medium]6. 创建自定义的事件类:MyEvent。[/size]

package com.android.eventbustwo;

/**
* 自定义的事件类
*/
public class MyEvent {
private String type;
private String content;

public String getType() {
return type;
}

public void setType(String type) {
this.type = type;
}

public String getContent() {
return content;
}

public void setContent(String content) {
this.content = content;
}
}


[size=medium]7. MainActivity。在按钮点击事件中,创建自定义事件类MyEvent的实例事件,并当点击按钮的时候,发送事件。[/size]

        btnSend.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
MyEvent event = new MyEvent();
event.setType("0");
event.setContent("0内容");
// 发送数据事件
EventBus.getDefault().post(event);
}
});


[align=center][img]http://dl2.iteye.com/upload/attachment/0110/9359/92e1037b-7c6b-312e-aefa-aa69b258cad3.png[/img][/align]

[size=medium]8. MainActivity。通过onEvent()订阅(接收)事件。[/size]

    public void onEvent(MyEvent event){
if(event.getType().equals("0")){
tvContent.setText(event.getContent());
}
}


[size=medium]运行效果如下:[/size]

[align=center][img]http://dl2.iteye.com/upload/attachment/0110/9361/4bbfefdc-955c-3d01-9b7e-493321eeb039.png[/img][/align]

[size=medium]9. MainActivity。在按钮点击事件中,将事件类型和内容改变,并当点击按钮的时候,发送事件。[/size]

        btnSend.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
MyEvent event = new MyEvent();
event.setType("1");
event.setContent("1内容");
// 发送数据事件
EventBus.getDefault().post(event);
}
});


[size=medium]10. MainActivity。通过onEventMainThread()同样可以订阅(接收)事件。[/size]

    public void onEventMainThread(MyEvent event){
if(event.getType().equals("1")){
tvContent.setText(event.getContent());
}
}


[size=medium]运行效果如下:[/size]

[align=center][img]http://dl2.iteye.com/upload/attachment/0110/9363/ca534e43-6d67-3a6e-834a-50094f059047.png[/img][/align]


[size=medium][b]代码补充:[/b][/size]

[size=medium]1. activity_main.xml[/size]

[size=medium]2. MainActivity[/size]

package com.android.eventbustwo;

import android.app.Activity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;

import de.greenrobot.event.EventBus;

public class MainActivity extends Activity {
// 2.
private TextView tvContent;
private Button btnSend;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// 3.
tvContent = (TextView) findViewById(R.id.tvContent);
btnSend = (Button) findViewById(R.id.btnSend);
// 6.
btnSend.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// 8.
MyEvent event = new MyEvent();
event.setType("0");
event.setContent("0内容");
// 发送数据事件
EventBus.getDefault().post(event);
}
});
// 4.
EventBus.getDefault().register(this);
}

/**
* 9.
* @param event
*/
public void onEvent(MyEvent event){
if(event.getType().equals("0")){
tvContent.setText(event.getContent());
}
}

/**
* 10.
* @param event
*/
public void onEventMainThread(MyEvent event){
if(event.getType().equals("1")){
tvContent.setText(event.getContent());
}
}

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

// -----------------------------------------------------------
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.menu_main, menu);
return true;
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId();

//noinspection SimplifiableIfStatement
if (id == R.id.action_settings) {
return true;
}

return super.onOptionsItemSelected(item);
}
}


[size=medium]3. MyEvent[/size]

package com.android.eventbustwo;

/**
* 7. 自定义的事件类
*/
public class MyEvent {
private String type;
private String content;

public String getType() {
return type;
}

public void setType(String type) {
this.type = type;
}

public String getContent() {
return content;
}

public void setContent(String content) {
this.content = content;
}
}



[b][size=large]案例三:Activity和Service之间互相发布与接收事件[/size][/b]

[size=medium]主活动有4家公司名显示,当在文本框中输入“Amazon”,点击按钮后,将新的公司名显示在主活动界面上。[/size]

[align=center][img]http://dl2.iteye.com/upload/attachment/0110/9503/3a5510c8-7322-3a13-8912-1651bc196ea2.png[/img][/align]

[align=center][img]http://dl2.iteye.com/upload/attachment/0110/9505/ae687405-9f1b-3fd8-b5da-f4264f5ee5b8.png[/img][/align]

[align=center][img]http://dl2.iteye.com/upload/attachment/0110/9507/5528e414-90e9-328c-bd38-30bf1b06241b.png[/img][/align]

[size=medium]1. 创建一个Service: EventService。[/size]

[size=medium]2. EventService。将onBind中的异常去掉,改为 返回null。[/size]

    @Override
public IBinder onBind(Intent intent) {
return null;
}


[size=medium]3. activity_main.xml。一个显示的文本框,用于显示Service发布的事件;一个可编辑文本框,用于输入字符串,并发布事件到Service;一个按钮,通过点击按钮,发布事件,然后Service进行订阅。[/size]

[align=center][img]http://dl2.iteye.com/upload/attachment/0110/9509/f504dc05-9272-3d09-b889-77b288ffa964.png[/img][/align]

<RelativeLayout 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:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context=".MainActivity">

<TextView
android:id="@+id/tvCompany"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/hello_world" />

<EditText
android:id="@+id/txtCompany"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@id/tvCompany"
android:hint="@string/txt_company" />

<Button
android:id="@+id/btnCompany"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@id/txtCompany"
android:text="@string/btn_send_company" />

</RelativeLayout>


[size=medium]4. EventService。重写onCreate()、onStartCommand()、onDestroy()方法。[/size]

[size=medium]5. EventService。声明一个 List 集合,用于放公司名的集合,并在onCreate()方法中创建实例(ArrayList类型)。[/size]

    private List<String> list;


        list = new ArrayList<>();


[size=medium]6. EventService。在onStartCommand()方法中,往List集合中添加元素(公司名)。销毁(onDestroy())的时候,集合设为null。[/size]

        list.add("Google");
list.add("Facebook");
list.add("Twitter");
list.add("Apple");


        list = null;


[size=medium]8. EventService。onCreate()中注册EventBus,onDestroy()销毁时注销注册。[/size]

        EventBus.getDefault().register(this);


        EventBus.getDefault().unregister(this);


[size=medium]9. MainActivity。onCreate()中同样注册EventBus,onDestroy()销毁时同样注销注册。[/size]

[size=medium]10. 新建一个目录:event,用来放事件类。[/size]

[size=medium]11. 在event目录下,新建一个用于从 Service 发布集合数据(公司名的集合)集合事件类:ListEvent。[/size]

public class ListEvent {
// 集合
private List<String> list;

// 含参构造方法
public ListEvent(List<String> list) {
this.list = list;
}

// getter方法(只需getter方法)
public List<String> getList() {
return list;
}
}


[size=medium]12. 在event目录下,新建一个用于从 Activity 发布字符串(公司名)的集合事件类:CompanyEvent。[/size]

public class CompanyEvent {
// 字符串 company
private String company;

// 含参构造方法
public CompanyEvent(String company) {
this.company = company;
}

// getter方法(只需getter方法)
public String getCompany() {
return company;
}
}


[size=medium]13. MainActivity。在按钮点击事件中,发布事件。[/size]

    @OnClick(R.id.btnCompany)
public void btnCompanyClick() {
// 获得 在 txtCompany 文本框中输入的 company 字符串 的值
String company = txtCompany.getText().toString();
// Activity 发布事件 --- 将 在 txtCompany 文本框中输入的 company 字符串,
// 使用 CompanyEvent 发布过去
EventBus.getDefault().post(new CompanyEvent(company));
// 发布之后,将 文本框内容清空
txtCompany.setText("");
}


[size=medium]14. EventService。Service订阅事件,将Activity发布的公司名加入List集合中。然后,再将最新的公司名List集合发布出去。[/size]

    /**
* Service 订阅事件
* @param event
*/
public void onEvent(CompanyEvent event){
// 将 事件中传过来的、在 txtCompany 文本框中输入的 company 字符串,放入 list集合中
list.add(event.getCompany());
// 再将 list集合,发布给 Activity,
// 这样,Activity订阅后,就可以在 控制台和界面上 显示最新的 list集合的值
EventBus.getDefault().postSticky(new ListEvent(list));
}


[size=medium]15. MainActivity。Activity 订阅了ListEvent事件,所以接收到了Service发布的公司名List集合的值,然后将其显示在控制台和界面的文本上。[/size]

    /**
* Activity 订阅事件
*
* @param event
*/
public void onEvent(ListEvent event) {
// 从Service发布的事件中获得 参数值(list集合)
List<String> list = event.getList();
// 日志输出 list集合的值 (控制台显示 list集合的值)
Log.v(TAG, list.toString());
// 将 list集合的值 显示在 tvCompany 文本中。(界面的文本上 显示 list集合的值)
tvCompany.setText(list.toString());
}



[size=medium][b]代码目录结构:[/b][/size]

[align=center][img]http://dl2.iteye.com/upload/attachment/0110/9513/5de91b64-3dfa-39ec-8ee4-e7350b717204.png[/img][/align]

[size=medium][b]补充代码:[/b][/size]

[size=medium](1)EventService。[/size]

package com.android.eventbusservice;

import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
import android.util.Log;

import com.android.eventbusservice.event.CompanyEvent;
import com.android.eventbusservice.event.ListEvent;

import java.util.ArrayList;
import java.util.List;

import de.greenrobot.event.EventBus;

public class EventService extends Service {
private static final String TAG = "MainActivity";
// 声明一个 List 集合 -- 用于放公司名的集合
private List<String> list;

public EventService() {
}


@Override
public void onCreate() {
super.onCreate();
Log.v(TAG,"Service.onCreate");
// 当前组件注册事件
// (注册事件后,一定要有 onEvent() 方法,否则报错)
EventBus.getDefault().register(this);
// 创建实例 - ArrayList类型
list = new ArrayList<>();
}

/**
* 此方法系统自动调用,不写也可。可把里面的代码写入 onCreate()里面。
*/
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
Log.v(TAG,"Service.onStartCommand");
// 往集合中添加元素
list.add("Google");
list.add("Facebook");
list.add("Twitter");
list.add("Apple");

// Service 发布事件 -- 将 list 集合,使用 ListEvent 发送过去
// (ListEvent:用于从 Service 传事件到 Activity)
EventBus.getDefault().postSticky(new ListEvent(list));
// 改为:返回 START_STICKY
return START_STICKY;
}

@Override
public void onDestroy() {
super.onDestroy();
Log.v(TAG, "Service.onDestroy");
// 销毁的时候,取消事件
EventBus.getDefault().unregister(this);
// 销毁的时候,集合设为空
list = null;
}

/**
* Service 订阅事件
* @param event
*/
public void onEvent(CompanyEvent event){
// 将 事件中传过来的、在 txtCompany 文本框中输入的 company 字符串,放入 list集合中
list.add(event.getCompany());
// 再将 list集合,发布给 Activity,
// 这样,Activity订阅后,就可以在 控制台和界面上 显示最新的 list集合的值
EventBus.getDefault().postSticky(new ListEvent(list));
}

@Override
public IBinder onBind(Intent intent) {
return null;
}
}


[size=medium](2)MainActivity。[/size]

package com.android.eventbusservice;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.EditText;
import android.widget.TextView;

import com.android.eventbusservice.event.CompanyEvent;
import com.android.eventbusservice.event.ListEvent;

import java.util.List;

import butterknife.ButterKnife;
import butterknife.InjectView;
import butterknife.OnClick;
import de.greenrobot.event.EventBus;

public class MainActivity extends Activity {
private static final String TAG = "MainActivity";

@InjectView(R.id.tvCompany)
TextView tvCompany;
@InjectView(R.id.txtCompany)
EditText txtCompany;


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

ButterKnife.inject(this);

// 在 Activity 中同样注册事件
EventBus.getDefault().register(this);

// 启动服务 -- 使用 startService 方式启动
// 启动服务后,activity与service脱钩了。
// 但是可以通过黄油刀进行联系。
startService(new Intent(this, EventService.class));
}

@Override
protected void onDestroy() {
super.onDestroy();
// 在 Activity 中同样注销事件
EventBus.getDefault().unregister(this);
}

@OnClick(R.id.btnCompany)
public void btnCompanyClick() {
// 获得 在 txtCompany 文本框中输入的 company 字符串 的值
String company = txtCompany.getText().toString();
// Activity 发布事件 --- 将 在 txtCompany 文本框中输入的 company 字符串,
// 使用 CompanyEvent 发布过去
EventBus.getDefault().post(new CompanyEvent(company));
// 发布之后,将 文本框内容清空
txtCompany.setText("");
}

/**
* Activity 订阅事件
*
* @param event
*/
public void onEvent(ListEvent event) {
// 从Service发布的事件中获得 参数值(list集合)
List<String> list = event.getList();
// 日志输出 list集合的值 (控制台显示 list集合的值)
Log.v(TAG, list.toString());
// 将 list集合的值 显示在 tvCompany 文本中。(界面的文本上 显示 list集合的值)
tvCompany.setText(list.toString());
}

// ---------------------------------------------------------
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.menu_main, menu);
return true;
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId();

//noinspection SimplifiableIfStatement
if (id == R.id.action_settings) {
return true;
}

return super.onOptionsItemSelected(item);
}
}



[b][size=large][color=red]整理时重点参考:[/color][url]http://www.jikexueyuan.com/course/933.html[/url][/size][/b]
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在 Nuxt2 中使用 eventBus 事件总线,可以通过以下步骤实现: 1. 创建一个 eventBus.js 文件 在项目的根目录中,创建一个 eventBus.js 文件,代码如下: ```javascript import Vue from 'vue'; export const eventBus = new Vue(); ``` 这里使用了 Vue 的实例来创建 eventBus,并且将它导出,这样就可以在项目中的任何地方使用它了。 2. 在需要使用 eventBus 的组件中引入 eventBus 在需要使用 eventBus 的组件中,可以使用以下代码来引入 eventBus: ```javascript import {eventBus} from '@/eventBus.js'; ``` 这里的 @ 表示项目的根目录,如果 eventBus.js 文件不在根目录中,那么需要改成相应的路径。 3. 使用 eventBus 发送事件 在需要发送事件的地方,可以使用以下代码来发送事件: ```javascript eventBus.$emit('eventName', data); ``` 这里的 eventName 是事件的名称,data 是传递的数据。 4. 使用 eventBus 监听事件 在需要监听事件的地方,可以使用以下代码来监听事件: ```javascript eventBus.$on('eventName', (data) => { // 处理事件 }); ``` 这里的 eventName 是事件的名称,data 是传递的数据。事件触发后,会执行回调函数中的代码。 总结: 以上就是在 Nuxt2 中使用 eventBus 事件总线的方法,通过使用 eventBus,可以在组件之间方便地进行通信。需要注意的是,eventBus 的使用需要谨慎,过多的使用可能会导致代码的可读性和维护性降低。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值