android消息通信,Android消息通信之无所不能的第三方开源项目EventBus



Android消息通信之无所不能的第三方开源项目EventBus

在Android开发中,消息通信在开发过程中是比较重要但比较略微繁琐的过程,比如,Activity与Fragment之间的消息通信,后台Service与前台Activity的消息通信,Fragment与Fragment之间的消息通信等等情况,Android本身提供的有完善的广播、在Service中也有的Messenger、handler中处理message等等完备的解决方案,而第三方的开源库EventBus同样提供了几乎无所不能、易于理解和使用的Android消息事件解决方案。

EventBus是github上的一个第三方开发库,其在github上的项目主页地址:https://github.com/greenrobot/EventBus

EventBus的消息模型是消息发布者/订阅者机制。

使用EventBus之前需要到EventBus项目主页上将库项目(https://github.com/greenrobot/EventBus/tree/master/EventBus ,截止2015年10月26日更新时间,未来也许有变动)包拖下来,接着作为Eclipse的一个工程导入,然后作为Android的一个lib,在自己的项目中引用即可。

本文以一个简单的代码例子说明EventBus。附录参考文章2、3、4说明了如何实现前台Activity与后台Service之间的消息通信,本文则在附录参考文章4的基础上改造,使用EventBus实现后台Service往前台Activity发送消息进而实现通信。

先丢出本文代码:

首先要定义一个自己的Event类,这个类可以随意定义,里面包括自己想要在消息通信中传递的各种复杂数据结构,本文则简单些,MyEvent.java:

package zhangphil.service;

//被EventBus类的定义可以随意

//这里面可以传递更复杂、更重的数据结构

public class MyEvent {

public int id;

public String content;

@Override

public String toString() {

return "id:" + id + " content:" + content;

}

}

前台Activity:

package zhangphil.service;

import android.app.Activity;

import android.content.Intent;

import android.os.Bundle;

import android.util.Log;

import android.widget.TextView;

import de.greenrobot.event.EventBus;

public class MainActivity extends Activity {

private TextView text;

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

text = (TextView) findViewById(R.id.textView);

// 一般在onCreate方法里面注册EventBus

EventBus.getDefault().register(this);

startMyService();

}

// 这里,EventBus回调接受消息,然后更新Main UI的TextView

public void onEventMainThread(MyEvent event) {

Log.d(this.getClass().getName(), "onEventMainThread:" + event.toString());

text.setText(event + "");

}

// EventBus回调接受消息

public void onEventBackgroundThread(MyEvent event) {

Log.d(this.getClass().getName(), "onEventBackgroundThread:" + event.toString());

}

// EventBus回调接受消息

public void onEventAsync(MyEvent event) {

Log.d(this.getClass().getName(), "onEventAsync:" + event.toString());

}

@Override

protected void onDestroy() {

super.onDestroy();

// 注销EventBus

EventBus.getDefault().unregister(this);

stopMyService();

}

private void startMyService() {

Intent intent = new Intent(this, MyService.class);

this.startService(intent);

}

private void stopMyService() {

Intent intent = new Intent(this, MyService.class);

this.stopService(intent);

}

}

后台Service:

package zhangphil.service;

import android.app.IntentService;

import android.content.Intent;

import android.os.IBinder;

import android.util.Log;

import de.greenrobot.event.EventBus;

public class MyService extends IntentService {

public MyService() {

super("MyService");

}

@Override

public int onStartCommand(Intent intent, int flags, int startId) {

return super.onStartCommand(intent, flags, startId);

}

@Override

protected void onHandleIntent(Intent intent) {

for (int i = 0; i < 10; i++) {

MyEvent event = new MyEvent();

event.id = i;

event.content = "数据" + i;

// 可以随意在工程代码中的任意位置发送消息给订阅者

EventBus.getDefault().post(event);

Log.d(this.getClass().getName(), "发送消息:" + event.toString());

try {

Thread.sleep(2000);

} catch (InterruptedException e) {

e.printStackTrace();

}

}

}

@Override

public IBinder onBind(Intent intent) {

return null;

}

@Override

public void onDestroy() {

Log.d(this.getClass().getName(), "onDestroy");

}

}

说明:

(1)EventBus是消息发布者(发送消息)/订阅者(接收消息)模式。EventBus的消息发布十分灵活,可以在工程代码中的任意位置发送消息。在本例中,EventBus在Service的onHandleIntent循环发布10条消息。EventBus 发布消息只需要一行代码即可实现:

EventBus.getDefault().post(event);

Event即为自己定义的类的实例。

(2)EventBus在接收消息的Activity(或Fragment)中初始化。在本例中是一个Activity接收消息,

首先,在Activity里面注册EventBus,通常在Android的Activity(或者Fragment)的onCreate里面注册,仅需一行代码:

EventBus.getDefault().register(this);

类似于注册一个消息监听Listener,完了不要忘记注销EventBus,在onDestory里面

EventBus.getDefault().unregister(this);

(3)EventBus接收消息。

在Activity中根据代码实际情况写一个EventBus的消息接收函数:

public void onEventMainThread(MyEvent event);

然后,只要EventBus发送消息,就可以在这里接收到。

EventBus的消息回调接收消息函数还有几个:

onEventMainThread:Main线程,这个与Android UI线程密切相关,不要阻塞它!

onEventBackgroundThread:故名思议,后台线程中接收处理。

onEventAsync:异步线程中接收处理。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值