android跨线程通信eventbus
来源:互联网 发布:手机五线谱制作软件 编辑:程序博客网 时间:2024/05/21 01:48
android进程内通信eventbus
EventBus是github上的一个第三方开源库,主要功能是替代Intent,Handler,BroadCast在Fragment,Activity,Service,线程之间传递消息.优点是开销小,代码更简洁。
其在github上的项目地址为 https://github.com/greenrobot/EventBus
它的官方提供的关系图如上,是一个Publish/Subscribe模式,由消息的发布者post消息,订阅者去接收消息
Event:事件,可以是任意自定义类
Subscriber:事件订阅者,接收特定的事件
Publisher:事件发布者,通知Subscriber发送Event
代码实现
首先在as的build.gradle中引用包
dependencies { compile 'org.greenrobot:eventbus:3.0.0'}
消息接受者用到以下函数
EventBus.getDefault().register(this);//订阅事件
EventBus.getDefault().unregister(this);//取消订阅
消息发布者用到post函数
EventBus.getDefault().post(object);//发布事件,object为自定义类
这里用activity和service之间通信为列子来看下实际使用方法
先写MainActivity作为事件的订阅者
布局文件
<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"><Button android:layout_width="match_parent" android:layout_height="wrap_content" android:id="@+id/start_service" android:text="start service"/><Button android:layout_width="match_parent" android:layout_height="wrap_content" android:id="@+id/stop_service" android:text="stop service"/></LinearLayout>
activity
package com.android.wwd.eventbusdemo;import android.content.Intent;import android.support.v7.app.AppCompatActivity;import android.os.Bundle;import android.util.Log;import android.view.View;import android.widget.Button;import org.greenrobot.eventbus.EventBus;import org.greenrobot.eventbus.Subscribe;import org.greenrobot.eventbus.ThreadMode;public class MainActivity extends AppCompatActivity {private final String TAG = "demolog";@Overrideprotected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //注册监听 EventBus.getDefault().register(this); Log.d(TAG,"mainTid = "+android.os.Process.myTid()); Button startButton = (Button)findViewById(R.id.start_service); startButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Intent intent = new Intent(MainActivity.this,NewService.class); startService(intent); } }); Button stopButton = (Button)findViewById(R.id.stop_service); stopButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Intent intent = new Intent(MainActivity.this,NewService.class); stopService(intent); } });}@Overrideprotected void onDestroy() { super.onDestroy(); //取消监听 EventBus.getDefault().unregister(this);}//接收订阅TestEvent事件的执行函数,当接收到发布者发布的TestEvent事件后会被调用//这里有4种线程方式下面介绍@Subscribe(threadMode = ThreadMode.MAIN)public void onEventMainThread(TestEvent event) { Log.d(TAG,"onEventMainThread msg = "+event.getMessage());}@Subscribe(threadMode = ThreadMode.POSTING)public void onEventPosting(TestEvent event) { Log.d(TAG,"onEventPosting msg = "+event.getMessage());}@Subscribe(threadMode = ThreadMode.BACKGROUND)public void onEventBackgroundThread(TestEvent event){ Log.d(TAG,"onEventBackgroundThread msg = "+event.getMessage());}@Subscribe(threadMode = ThreadMode.ASYNC)public void onEventAsync(TestEvent event){ Log.d(TAG,"onEventAsync msg = "+event.getMessage());}}
自定义TestEvent,用来传递数据
public class TestEvent {private String mMsg;public TestEvent(String msg){ mMsg = msg;}public String getMessage(){ return mMsg;}}
4种threadMode的具体说明可以在http://greenrobot.org/eventbus/documentation/delivery-threads-threadmode/里查看。
ThreadMode.MAIN:会在主线程中执行函数
ThreadMode.POSTING:会在发布者的线程中执行函数
ThreadMode.BACKGROUND:如果发布者的线程不是主线程,则执行函数会在发布者的线程中执行。如果发布者线程是主线程,则执行函数会在后台进程中依次执行。
ThreadMode.ASYNC:在一个独立的线程中执行函数。
简单的总结下就是当你需要执行一个长时间的操作时最好用ThreadMode.ASYNC否则可能anr,如果要立即进行些UI操作可以用ThreadMode.MAIN。
消息的发布者service
package com.android.wwd.eventbusdemo;import android.app.Service;import android.content.Intent;import android.os.IBinder;import android.util.Log;import org.greenrobot.eventbus.EventBus;public class NewService extends Service{private final String TAG = "demolog";@Overridepublic IBinder onBind(Intent intent) { return null;}@Overridepublic void onCreate() { super.onCreate();}@Overridepublic void onDestroy() { super.onDestroy();}@Overridepublic void onStart(Intent intent, int startId) {Log.d(TAG,"service PublisherTid = "+android.os.Process.myTid()); //在这里发布事件 EventBus.getDefault().post( new TestEvent("EventBus push")); super.onStart(intent, startId);}@Overridepublic boolean onUnbind(Intent intent) { return super.onUnbind(intent);}}
代码基本就这些,整个流程就是在作为订阅者的activity在oncreate中注册监听事件,然后点击button启动service,作为发布者的service启动之后发布事件。最后订阅者activity收到消息执行响应操作。
执行之后log如下
15:56:44.683 3826-3826/com.android.wwd.eventbusdemo D/demolog: onCreate mainTid = 382615:56:46.411 3826-3826/com.android.wwd.eventbusdemo D/demolog: service PublisherTid = 382615:56:46.419 3826-3826/com.android.wwd.eventbusdemo D/demolog: onEventMainThread msg = EventBus push15:56:46.419 3826-3923/com.android.wwd.eventbusdemo D/demolog: onEventBackgroundThread msg = EventBus push15:56:46.419 3826-3826/com.android.wwd.eventbusdemo D/demolog: onEventPosting msg = EventBus push15:56:46.419 3826-3922/com.android.wwd.eventbusdemo D/demolog: onEventAsync msg = EventBus push
- android跨线程通信eventbus
- Android EventBus 通信
- Android-------------EventBus通信
- 【EventBus】Android 快速通信框架EventBus
- Android EventBus 简化应用程序组件(Activity、Fragment、线程)间通信的开源项目
- Android组件间通信库EventBus学习
- Android组件间通信库EventBus学习
- android 控件通信原理之eventBus
- Android组件间通信库EventBus收集
- Android组件间通信框架EventBus
- Android组件间通信——EventBus
- Android组件间通信库EventBus学习
- Android开发系列通信篇之EventBus
- Android开发系列通信篇之EventBus
- Android开发系列通信篇之EventBus
- Android组件间通信库EventBus学习
- Android组件间通信库EventBus学习
- Android应用程序中的通信与EventBus
- 模拟试——rate
- 【数字图像处理】实现拉普拉斯锐化
- maven 设置日志级别
- 对象的行为
- centos7 二进制安装mysql 5.7.16版本
- android跨线程通信eventbus
- 信号量dispatch_semaphore在iOS APP编程里的“应用”
- AndroidStudio 配置Kotlin
- acquireFence、releaseFence、retireFence
- docker 搭建私有仓库registry (多用户)
- 轻松理解依赖注入
- ArrayList和LinkedList性能比较
- arm bootloder最小启动
- [Unity&GameSparks]其他twitter用户怎么登录