android跨线程通信eventbus

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";

@Override
protected 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);
    }
    });
}

@Override
protected 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";

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

@Override
public void onCreate() {
    super.onCreate();
}

@Override
public void onDestroy() {
    super.onDestroy();
}

@Override
public 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);
}

@Override
public 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 = 3826
15:56:46.411 3826-3826/com.android.wwd.eventbusdemo D/demolog: service PublisherTid = 3826
15:56:46.419 3826-3826/com.android.wwd.eventbusdemo D/demolog: onEventMainThread msg = EventBus push
15:56:46.419 3826-3923/com.android.wwd.eventbusdemo D/demolog: onEventBackgroundThread msg = EventBus push
15:56:46.419 3826-3826/com.android.wwd.eventbusdemo D/demolog: onEventPosting msg = EventBus push
15:56:46.419 3826-3922/com.android.wwd.eventbusdemo D/demolog: onEventAsync msg = EventBus push
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值