- 浏览: 90811 次
- 性别:
- 来自: 长沙
文章分类
最新评论
-
wangyudong:
家里是拨号上网,不行的,找到了一个Holer工具,只需要配置一 ...
【如何通过广域网访问局域网的服务器?】 -
叮咚可乐名:
大数据就是这么任性第一季数据结构和算法http://pan.b ...
数据结构与算法-简介 -
戢_时光:
...
【Java集合之二】Set集合 -
lzg406:
HTTP默认方式下,使用持久连接。 这个值得推敲
【应用层】之一:HTTP协议与FTP协议 -
mute_:
特别腻害呢
正则表达式1:概念
本文围绕以下六个部分展开:
一、事件总线管理
二、EventBus
三、EventBus与BroadcastReceiver的区别
案例一
案例二:一处点击发送数据,另一处或多处注册点可以及时获取更新传输过来的数据
案例三:Activity和Service之间互相发布与接收事件
一、事件总线管理
将事件放入队列里,用于管理和分发。
(1)保证应用的各个部分之间高效的通信及数据、事件分发。
(2)模块间解耦:通过事件的分发,可以让各个模块间关联程序变小。
当在开发一些庞大的的项目时,模块比较多,这个时候为了避免耦合度和保证 APP 的效率,会用到 EventBus 等类似的事件总线处理模型。这样可以简化一些数据传输操作,保证APP的简洁,做到高内聚、低耦合。
二、EventBus
1. 概念
EventBus是一个发布/订阅的事件总线。它可以让两个组件相互通信,但是它们之间并不相互知晓。
EventBus模式,也被称为 Message Bus模式,或者 发布者/订阅者(publisher/subscriber)模式。
事件响应有更多的线程选择,EventBus 可以向不同的线程中发布事件。
EventBus 支持 Sticky Event。
2. 有3个主要的元素:
(1)Event:事件。
Event可以是任意类型的对象。
(2)Subscriber:事件订阅者,接收特定的事件。
在EventBus中,使用约定来指定事件订阅者以简化使用。即,所有事件订阅都是以onEvent开头的函数。具体来说,函数的名字是onEventMainThread,onEventPostThread,onEventBackgroundThread,onEventAsync这四个,onEvent是默认的接收数据处理的方法。这四个事件订阅函数,每个都与一个“ThreadMode”相关联,ThreadMode指定了会调用的函数。有以下4个ThreadMode:
1)PostThread:事件的处理和事件的发送在相同的进程。
事件处理时间不应太长,不然影响事件的发送线程,而这个线程可能是UI线程。对应的函数名是onEvent。
2)MainThread:事件的处理会在UI线程中执行。
事件处理时间不应太长,长了会ANR的。对应的函数名是onEventMainThread。
3)BackgroundThread:事件的处理会在一个后台线程中执行。
虽然事件处理是在后台线程,但事件处理时间还是不应该太长,因为如果发送事件的线程是后台线程,会直接执行事件。如果当前线程是UI线程,事件会被加到一个队列中,由一个线程依次处理这些事件,如果某个事件处理时间太长,会阻塞后面的事件的派发或处理。对应的函数名是onEventBackgroundThread。
4)AsyncThread:事件处理会在单独的线程中执行。
主要用于在后台线程中执行耗时操作,每个事件会开启一个线程(有线程池),但最好限制线程的数目。
根据事件订阅的函数名称的不同,会使用不同的ThreadMode。比如在后台线程加载了数据想在UI线程显示,订阅者只需把函数命名为onEventMainThread。
3. 基本用法
分 注册、订阅、发布、注销注册 等步骤。使用时需先注册、订阅,然后向订阅者发布消息数据即可。
(1)注册(3个构造方法):
EventBus.getDefault().register(this);
EventBus.getDefault().register(new MyClass());
// 注册三个参数分别是:消息订阅者(接收者),接收方法名,事件类。 EventBus.getDefault().register(this,"setTextA",SetTextAEvent.class);
(2)注销注册:
EventBus.getDefault().unregister(this);
EventBus.getDefault().unregister(new MyClass());
(3)定义事件类型:
public class MyEvent {}
(4)订阅处理数据:
public void onEvent(AnyEventType event){}:默认的接收数据处理的方法
public void onEventMainThread{}
onEventPostThread
onEventBackgroundThread
onEventAsync
(5)发布:
EventBus.getDefault().postSticky(new SecondActivityEvent("Message from SecondActivity"));
EventBus.getDefault().post(new ChangeImgEvent(1));
三、EventBus与BroadcastReceiver的区别
1. 二者类似。
在Android中广播分为两个方面:广播发送者和广播接收者,通常情况下,BroadcastReceiver指的就是广播接收者(广播接收器)。
广播:在一个地方注册广播,在另一个地方针对action发送广播、传递数据,对应注册的地方就可以收到广播。
EventBus:基于订阅/发布的模式。在需要接收数据的地方,进行注册与订阅,在需要发布数据的地方发布,则在注册的地方就可以收到了。
简单点说,就是两人约定好怎么通信,一人发布消息,另外一个约定好的人立马接收到你发的消息。EventBus就可以帮助减少做很多事,不管你在任何地方任何位置发布一个事件,接收者都能立马接收到你的消息,不用你考虑android子线程操作UI线程的问题。
2. 二者区别。
(1)EventBus 有三个主要的元素:事件、订阅和发布。广播两个元素:订阅和发布,但是广播是针对整个App而言的。
(2)BroadcastReceiver是组件,需要在功能清单中注册。而EventBus 不需要注册。
(3)BroadcastReceiver只能做一件事情,而EventBus多事件处理比较好。
(4)在不同场景中的适用性:
1)同一App内部的同一组件内的消息通信(单个或多个线程之间),实际应用中肯定是不会用到广播机制的(虽然可以用),无论是使用扩展变量作用域、基于接口的回调还是Handler-post/Handler-Message等方式,都可以直接处理此类问题,若使用广播机制,显然有些“杀鸡牛刀”的感觉。
2)同一app内部的不同组件之间的消息通信(单个进程),对于此类需求,在有些教复杂的情况下单纯的依靠基于接口的回调等方式不好处理,此时可以直接使用EventBus等,相对而言,EventBus由于是针对同一进程,用于处理此类需求非常适合,且轻松。
3)其他情形,由于涉及不同进程间的消息通信,此时根据实际业务使用广播机制会显得非常适宜。
案例一
MainActivity
案例二:一处点击发送数据,另一处或多处注册点可以及时获取更新传输过来的数据
1. activity_main.xml。写一个按钮和一个文本框。
2. MainActivity。声明和初始化两个控件。
3. MainActivity。onCreate()方法中注册。
4. MainActivity。onDestroy()方法中取消注册。
5. MainActivity。通过事件监听器设置按钮的点击事件。
6. 创建自定义的事件类:MyEvent。
7. MainActivity。在按钮点击事件中,创建自定义事件类MyEvent的实例事件,并当点击按钮的时候,发送事件。
8. MainActivity。通过onEvent()订阅(接收)事件。
运行效果如下:
9. MainActivity。在按钮点击事件中,将事件类型和内容改变,并当点击按钮的时候,发送事件。
10. MainActivity。通过onEventMainThread()同样可以订阅(接收)事件。
运行效果如下:
代码补充:
1. activity_main.xml
2. MainActivity
3. MyEvent
案例三:Activity和Service之间互相发布与接收事件
主活动有4家公司名显示,当在文本框中输入“Amazon”,点击按钮后,将新的公司名显示在主活动界面上。
1. 创建一个Service: EventService。
2. EventService。将onBind中的异常去掉,改为 返回null。
3. activity_main.xml。一个显示的文本框,用于显示Service发布的事件;一个可编辑文本框,用于输入字符串,并发布事件到Service;一个按钮,通过点击按钮,发布事件,然后Service进行订阅。
4. EventService。重写onCreate()、onStartCommand()、onDestroy()方法。
5. EventService。声明一个 List 集合,用于放公司名的集合,并在onCreate()方法中创建实例(ArrayList类型)。
6. EventService。在onStartCommand()方法中,往List集合中添加元素(公司名)。销毁(onDestroy())的时候,集合设为null。
8. EventService。onCreate()中注册EventBus,onDestroy()销毁时注销注册。
9. MainActivity。onCreate()中同样注册EventBus,onDestroy()销毁时同样注销注册。
10. 新建一个目录:event,用来放事件类。
11. 在event目录下,新建一个用于从 Service 发布集合数据(公司名的集合)集合事件类:ListEvent。
12. 在event目录下,新建一个用于从 Activity 发布字符串(公司名)的集合事件类:CompanyEvent。
13. MainActivity。在按钮点击事件中,发布事件。
14. EventService。Service订阅事件,将Activity发布的公司名加入List集合中。然后,再将最新的公司名List集合发布出去。
15. MainActivity。Activity 订阅了ListEvent事件,所以接收到了Service发布的公司名List集合的值,然后将其显示在控制台和界面的文本上。
代码目录结构:
补充代码:
(1)EventService。
(2)MainActivity。
整理时重点参考:http://www.jikexueyuan.com/course/933.html
一、事件总线管理
二、EventBus
三、EventBus与BroadcastReceiver的区别
案例一
案例二:一处点击发送数据,另一处或多处注册点可以及时获取更新传输过来的数据
案例三:Activity和Service之间互相发布与接收事件
一、事件总线管理
将事件放入队列里,用于管理和分发。
(1)保证应用的各个部分之间高效的通信及数据、事件分发。
(2)模块间解耦:通过事件的分发,可以让各个模块间关联程序变小。
当在开发一些庞大的的项目时,模块比较多,这个时候为了避免耦合度和保证 APP 的效率,会用到 EventBus 等类似的事件总线处理模型。这样可以简化一些数据传输操作,保证APP的简洁,做到高内聚、低耦合。
二、EventBus
1. 概念
EventBus是一个发布/订阅的事件总线。它可以让两个组件相互通信,但是它们之间并不相互知晓。
EventBus模式,也被称为 Message Bus模式,或者 发布者/订阅者(publisher/subscriber)模式。
事件响应有更多的线程选择,EventBus 可以向不同的线程中发布事件。
EventBus 支持 Sticky Event。
2. 有3个主要的元素:
(1)Event:事件。
Event可以是任意类型的对象。
(2)Subscriber:事件订阅者,接收特定的事件。
在EventBus中,使用约定来指定事件订阅者以简化使用。即,所有事件订阅都是以onEvent开头的函数。具体来说,函数的名字是onEventMainThread,onEventPostThread,onEventBackgroundThread,onEventAsync这四个,onEvent是默认的接收数据处理的方法。这四个事件订阅函数,每个都与一个“ThreadMode”相关联,ThreadMode指定了会调用的函数。有以下4个ThreadMode:
1)PostThread:事件的处理和事件的发送在相同的进程。
事件处理时间不应太长,不然影响事件的发送线程,而这个线程可能是UI线程。对应的函数名是onEvent。
2)MainThread:事件的处理会在UI线程中执行。
事件处理时间不应太长,长了会ANR的。对应的函数名是onEventMainThread。
3)BackgroundThread:事件的处理会在一个后台线程中执行。
虽然事件处理是在后台线程,但事件处理时间还是不应该太长,因为如果发送事件的线程是后台线程,会直接执行事件。如果当前线程是UI线程,事件会被加到一个队列中,由一个线程依次处理这些事件,如果某个事件处理时间太长,会阻塞后面的事件的派发或处理。对应的函数名是onEventBackgroundThread。
4)AsyncThread:事件处理会在单独的线程中执行。
主要用于在后台线程中执行耗时操作,每个事件会开启一个线程(有线程池),但最好限制线程的数目。
根据事件订阅的函数名称的不同,会使用不同的ThreadMode。比如在后台线程加载了数据想在UI线程显示,订阅者只需把函数命名为onEventMainThread。
3. 基本用法
分 注册、订阅、发布、注销注册 等步骤。使用时需先注册、订阅,然后向订阅者发布消息数据即可。
(1)注册(3个构造方法):
EventBus.getDefault().register(this);
EventBus.getDefault().register(new MyClass());
// 注册三个参数分别是:消息订阅者(接收者),接收方法名,事件类。 EventBus.getDefault().register(this,"setTextA",SetTextAEvent.class);
(2)注销注册:
EventBus.getDefault().unregister(this);
EventBus.getDefault().unregister(new MyClass());
(3)定义事件类型:
public class MyEvent {}
(4)订阅处理数据:
public void onEvent(AnyEventType event){}:默认的接收数据处理的方法
public void onEventMainThread{}
onEventPostThread
onEventBackgroundThread
onEventAsync
(5)发布:
EventBus.getDefault().postSticky(new SecondActivityEvent("Message from SecondActivity"));
EventBus.getDefault().post(new ChangeImgEvent(1));
三、EventBus与BroadcastReceiver的区别
1. 二者类似。
在Android中广播分为两个方面:广播发送者和广播接收者,通常情况下,BroadcastReceiver指的就是广播接收者(广播接收器)。
广播:在一个地方注册广播,在另一个地方针对action发送广播、传递数据,对应注册的地方就可以收到广播。
EventBus:基于订阅/发布的模式。在需要接收数据的地方,进行注册与订阅,在需要发布数据的地方发布,则在注册的地方就可以收到了。
简单点说,就是两人约定好怎么通信,一人发布消息,另外一个约定好的人立马接收到你发的消息。EventBus就可以帮助减少做很多事,不管你在任何地方任何位置发布一个事件,接收者都能立马接收到你的消息,不用你考虑android子线程操作UI线程的问题。
2. 二者区别。
(1)EventBus 有三个主要的元素:事件、订阅和发布。广播两个元素:订阅和发布,但是广播是针对整个App而言的。
(2)BroadcastReceiver是组件,需要在功能清单中注册。而EventBus 不需要注册。
(3)BroadcastReceiver只能做一件事情,而EventBus多事件处理比较好。
(4)在不同场景中的适用性:
1)同一App内部的同一组件内的消息通信(单个或多个线程之间),实际应用中肯定是不会用到广播机制的(虽然可以用),无论是使用扩展变量作用域、基于接口的回调还是Handler-post/Handler-Message等方式,都可以直接处理此类问题,若使用广播机制,显然有些“杀鸡牛刀”的感觉。
2)同一app内部的不同组件之间的消息通信(单个进程),对于此类需求,在有些教复杂的情况下单纯的依靠基于接口的回调等方式不好处理,此时可以直接使用EventBus等,相对而言,EventBus由于是针对同一进程,用于处理此类需求非常适合,且轻松。
3)其他情形,由于涉及不同进程间的消息通信,此时根据实际业务使用广播机制会显得非常适宜。
案例一
MainActivity
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); } }
案例二:一处点击发送数据,另一处或多处注册点可以及时获取更新传输过来的数据
1. activity_main.xml。写一个按钮和一个文本框。
<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>
2. MainActivity。声明和初始化两个控件。
private TextView tvContent; private Button btnSend;
tvContent = (TextView) findViewById(R.id.tvContent); btnSend = (Button) findViewById(R.id.btnSend);
3. MainActivity。onCreate()方法中注册。
EventBus.getDefault().register(this);
4. MainActivity。onDestroy()方法中取消注册。
@Override protected void onDestroy() { super.onDestroy(); EventBus.getDefault().unregister(this); }
5. MainActivity。通过事件监听器设置按钮的点击事件。
btnSend.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { } });
6. 创建自定义的事件类:MyEvent。
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; } }
7. MainActivity。在按钮点击事件中,创建自定义事件类MyEvent的实例事件,并当点击按钮的时候,发送事件。
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); } });
8. MainActivity。通过onEvent()订阅(接收)事件。
public void onEvent(MyEvent event){ if(event.getType().equals("0")){ tvContent.setText(event.getContent()); } }
运行效果如下:
9. MainActivity。在按钮点击事件中,将事件类型和内容改变,并当点击按钮的时候,发送事件。
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); } });
10. MainActivity。通过onEventMainThread()同样可以订阅(接收)事件。
public void onEventMainThread(MyEvent event){ if(event.getType().equals("1")){ tvContent.setText(event.getContent()); } }
运行效果如下:
代码补充:
1. activity_main.xml
2. MainActivity
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); } }
3. MyEvent
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; } }
案例三:Activity和Service之间互相发布与接收事件
主活动有4家公司名显示,当在文本框中输入“Amazon”,点击按钮后,将新的公司名显示在主活动界面上。
1. 创建一个Service: EventService。
2. EventService。将onBind中的异常去掉,改为 返回null。
@Override public IBinder onBind(Intent intent) { return null; }
3. activity_main.xml。一个显示的文本框,用于显示Service发布的事件;一个可编辑文本框,用于输入字符串,并发布事件到Service;一个按钮,通过点击按钮,发布事件,然后Service进行订阅。
<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>
4. EventService。重写onCreate()、onStartCommand()、onDestroy()方法。
5. EventService。声明一个 List 集合,用于放公司名的集合,并在onCreate()方法中创建实例(ArrayList类型)。
private List<String> list;
list = new ArrayList<>();
6. EventService。在onStartCommand()方法中,往List集合中添加元素(公司名)。销毁(onDestroy())的时候,集合设为null。
list.add("Google"); list.add("Facebook"); list.add("Twitter"); list.add("Apple");
list = null;
8. EventService。onCreate()中注册EventBus,onDestroy()销毁时注销注册。
EventBus.getDefault().register(this);
EventBus.getDefault().unregister(this);
9. MainActivity。onCreate()中同样注册EventBus,onDestroy()销毁时同样注销注册。
10. 新建一个目录:event,用来放事件类。
11. 在event目录下,新建一个用于从 Service 发布集合数据(公司名的集合)集合事件类:ListEvent。
public class ListEvent { // 集合 private List<String> list; // 含参构造方法 public ListEvent(List<String> list) { this.list = list; } // getter方法(只需getter方法) public List<String> getList() { return list; } }
12. 在event目录下,新建一个用于从 Activity 发布字符串(公司名)的集合事件类:CompanyEvent。
public class CompanyEvent { // 字符串 company private String company; // 含参构造方法 public CompanyEvent(String company) { this.company = company; } // getter方法(只需getter方法) public String getCompany() { return company; } }
13. MainActivity。在按钮点击事件中,发布事件。
@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(""); }
14. EventService。Service订阅事件,将Activity发布的公司名加入List集合中。然后,再将最新的公司名List集合发布出去。
/** * 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)); }
15. MainActivity。Activity 订阅了ListEvent事件,所以接收到了Service发布的公司名List集合的值,然后将其显示在控制台和界面的文本上。
/** * 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()); }
代码目录结构:
补充代码:
(1)EventService。
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; } }
(2)MainActivity。
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); } }
整理时重点参考:http://www.jikexueyuan.com/course/933.html
发表评论
-
【攻克Android (43)】WebView (网络视图)
2015-09-09 22:15 1249本文围绕以下两个部分展开: 一、WebView WebVi ... -
WebView (网络视图)
2015-09-09 22:12 0本文围绕以下两个部分展开: 一、WebView WebVi ... -
【攻克Android (41)】HttpURLConnection
2015-09-08 17:43 1358本文围绕以下三个部分展开: 一、HttpURLConnec ... -
HttpURLConnection
2015-09-08 17:42 0本文围绕以下三个部分展开: 一、HttpURLConnec ... -
【攻克Android (40)】JSON解析
2015-09-07 20:49 1271本文围绕以下三个部分 ... -
JSON解析
2015-09-07 20:47 0本文围绕以下三个部分 ... -
【攻克Android (39):XML解析之四】Simple方式解析XML
2015-08-27 18:38 1741本文围绕以下三个部分 ... -
【攻克Android (38):XML解析之三】Pull方式解析XML
2015-08-27 09:25 1734本文围绕以下两个部分展开: 一、Pull解析 案例一:P ... -
【攻克Android (37):XML解析之二】SAX方式解析XML
2015-08-26 15:15 872本文围绕以下两个部分展开: 一、SAX解析 案例一 ... -
【XML解析之一】SAX方式解析XML
2015-08-26 02:58 0本文围绕以下四个部分展开: 一、SAX解析 案例一 ... -
【攻克Android (36):XML解析之一】DOM方式解析XML
2015-08-26 00:27 937本文围绕以下三个部分展开: 一、XML概述 二、DOM解析 ... -
DOM方式解析XML案例
2015-08-26 00:26 0本文围绕以下四个部分展开: 一、DOM解析 案例一 ... -
【XML解析之四】Simple方式解析XML
2015-08-27 18:36 0本文围绕以下三个部分 ... -
【XML解析之一】Pull方式解析XML
2015-08-26 02:56 0本文围绕以下四个部分展开: 一、Pull解析 案例一:P ... -
【攻克Android (22)】View/Tween Animation 视图动画(补间动画)
2015-08-25 21:22 877本文围绕以下四个部分 ... -
【攻克Android (22)】View/Tween Animation 视图动画(补间动画)
2015-08-25 21:21 0本文围绕以下四个部分 ... -
【攻克Android (45)】四大组件之 ContentProvider
2015-08-18 16:24 1098本文围绕以下两个部分展开: 一、ContentProvide ... -
【攻克Android (32)】Notification 通知
2015-08-17 19:57 945本文围绕以下两个部分展开: 一、通知 案例一 一 ... -
Notification 通知
2015-08-17 19:56 0本文围绕以下两个部分展开: 一、通知 案例一 一 ... -
BroadcastReceiver完整版
2015-08-17 13:15 0本文围绕以下四个部分展开: 一、广播 案例一:系统广播(属于 ...
相关推荐
Event Bus是一个发布 /...基于事件总线管理/订阅/分发模式的。事件响应有更多的线程选择, EventBus可以向不同的线程中发布事件。EventBus支持 Sticky Event。 使用时需要先注册订阅,然后向订阅者分发消息数据即可。
【EventBus事件总线c#】是一个用于C#和.NET框架中的事件驱动编程模式的简单实现,它允许组件之间解耦通信。事件总线的概念来源于软件设计模式,它提供了一个中心化的机制,使得应用程序的不同部分可以发布和订阅事件...
4. **性能优化**:EventBus 在设计时考虑了性能,事件分发快速,不会导致不必要的内存泄漏。 在实际开发中,EventBus 能帮助开发者更好地管理组件间的通信,提高代码质量。然而,也需要注意过度使用可能带来的问题...
这个压缩包“C#版本EventBus事件总线实例源码_(0610).rar.rar”包含了C#实现事件总线模式的一个实例源码,我们可以从中学到如何在C#中应用事件总线。 事件总线的主要思想是将事件发布者与事件订阅者解耦,使得它们...
这通常涉及处理事件发布、订阅逻辑,以及将事件分发到订阅者。 4. **订阅事件**:在需要接收特定事件的类中,添加订阅方法,注册到EventBus。这些方法通常标记为`EventHandler<T>`,其中`T`是事件类型。 5. **发布...
"C#版本EventBus事件总线实例源码"是关于如何在C#项目中实现事件驱动架构的一个示例。事件总线(EventBus)是这种架构模式的一种实现,它允许不同的组件之间通过发布和订阅事件进行通信,而无需直接耦合。 事件总线的...
【C#版本EventBus事件总线实例源码2019】是一个关于C#编程语言中的事件总线设计模式的应用示例。事件总线是一种松耦合的通信机制,允许不同组件之间通过发布和订阅事件来进行通信,而无需直接相互依赖。在C#中实现...
事件总线是系统中的一个中介,它负责接收事件发布者发布的事件,并将这些事件分发给感兴趣的订阅者。这种模式允许组件之间松散耦合,提高了系统的可扩展性和灵活性。 2. **C#事件机制**: 在C#中,事件是基于委托...
你是否在开发的过程中遇到过想在Activity-B中回调Activity-A中的某个函数,但Activity又不能手动创建对象来设置一个Listener什么的?... 等等之类的组件之间的交互问题,事件总线框架就是你所需要的
5. **使用示例**:在实际应用中,发布者触发事件,事件总线负责分发,订阅者接收到事件并进行处理。例如: ```csharp class Program { static void Main(string[] args) { var publisher = new Publisher(); ...
这个"简单EventBus事件总线源码(.net)适合初学者.rar"压缩包提供了一个适合初学者学习的EventBus实现示例。 首先,我们要理解EventBus的核心功能。EventBus的主要任务是作为一个中间人,连接事件的发布者和订阅者...
3. **分发(Dispatch)**: EventBus负责将事件分发给所有订阅了该事件的订阅者。它可以是同步的,也可以是异步的,取决于具体实现。 **C#中的EventBus实现** 在C#中,EventBus的实现可以基于多种方式,例如使用委托...
3. **事件总线(Event Bus)**:作为中间人,负责维护事件发布者和订阅者之间的关系,以及触发事件的分发。 在C#中实现事件总线,我们可以创建一个静态类,如`EventBus`,提供`Publish`方法用于发布事件,以及`...
4. **发布/订阅逻辑**:EventBus类需要实现将事件分发给所有订阅了该事件的处理器。这可能涉及到线程安全问题,因此可能使用了锁或者其他并发控制机制。 5. **应用示例**:源码可能包含一些测试或示例代码,展示了...
同时,会有一个类作为事件总线,负责管理和分发事件。 事件委托是C#中定义事件的类,它继承自System.Delegate,通常与多播委托(Multicast Delegate)一起使用,允许多个订阅者同时响应同一事件。在源码中,你可能...