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
原创粉丝点击