android 线程安全,android – 具有线程安全性的eventbus的最佳实践

该博客探讨了一种Android应用程序中处理并发问题的方法,通过使用GreenRobot's EventBus和Handler来确保事件(如用户交互和网络消息)的串行执行。作者寻求更智能、更快、更简洁的代码来替代当前实现,尤其是想避免为每个事件创建单独的onEvent方法,并确保在不使用Handler的情况下实现事件的串行处理。
摘要由CSDN通过智能技术生成

我的应用程序具有用户交互活动和后台服务,后台服务是修改数据模型的唯一场所.后台服务侦听用户所做的操作以及来自网络的传入消息.因此,我试图通过使用处理程序来防止并发问题.

对于事件层,我使用greenrobots Eventbus.

这一切都运行良好,但我想知道是否有更智能/更快/更少的代码(并因此不易出错)处理此用例的方式?

更具体:

>有没有办法确保onEvent方法的串行执行

没有处理程序?

>是否有替代onEvent方法

对于每个可能的事件?

>对于我来说,是否有更好的模式

在这儿干?

这是我的方法:

在oncreate方法中,我注册了服务(如果是活动,我在onstart中执行此操作)

@Override

public void onCreate() {

super.onCreate();

...

EventBus.getDefault().register(this);

}

在onDestroy中我再次取消注册:

@Override

public void onDestroy() {

super.onDestroy();

....

EventBus.getDefault().unregister(this);

}

每当我对传入的事件作出反应时,我都希望确保串行执行,因为可能存在concurreny问题,因为来自用户交互以及来自其他用户的传入事件都是通过网络传递的.所以我决定使用一个处理程序:

private Handler handler = new Handler(){

@Override

public void handleMessage(Message msg) {

Object receivedEvent = msg.obj;

if(receivedEvent instanceof EditUser)

{

processEditUserBroadcast((EditUser)receivedEvent);

}

else if(receivedEvent instanceof JoinParty)

{

processJoinPartyBroadcast((JoinParty)receivedEvent);

}

else if(receivedEvent instanceof LeaveParty)

{

processLeavePartyBroadcast();

}

else if(receivedEvent instanceof SendMessage)

{

processSendMessageBroadcast((SendMessage)receivedEvent);

}

else if(receivedEvent instanceof ReceivedMessage)

{

processReceivedMessageBroadcast((ReceivedMessage)receivedEvent);

}

else if(receivedEvent instanceof Reset)

{

processResetBroadcast();

}

else if(receivedEvent instanceof ImageDownloadFinished)

{

processImageDownloadFinishedBroadcast((ImageDownloadFinished)receivedEvent);

}

}

};

return handler;

}

对于每个感兴趣的事件,我都有一个onEvent方法,除了将事件传递给处理程序以确保通过一个小的“passToHandler”辅助函数来执行串行执行之外什么都不做

public void passToHandler(Handler handler, Object object)

{

Message message = handler.obtainMessage();

message.obj = object;

handler.sendMessage(message);

}

public void onEvent(EditUser editUser)

{

passToHandler(handler,editUser);

}

public void onEvent(JoinParty joinParty)

{

passToHandler(handler,joinParty);

}

public void onEvent(LeaveParty leaveParty)

{

passToHandler(handler,leaveParty);

}

public void onEvent(SendMessage sendMessage)

{

passToHandler(handler,sendMessage);

}

public void onEvent(ReceivedMessage receivedMessage)

{

passToHandler(handler,receivedMessage);

}

public void onEvent(Reset reset)

{

passToHandler(handler,reset);

}

public void onEvent(ImageDownloadFinished imageDownloadFinished)

{

passToHandler(handler,imageDownloadFinished);

}

“过程……”方法是“数据魔法”发生的地方,不应该与我的问题相关.

当然,对于每个可能的事件我都创建了一个通常非常苗条的类,如下所示:

public class JoinParty {

private String partyCode;

public JoinParty(String partyCode) {

super();

this.partyCode = partyCode;

}

public String getPartyCode() {

return partyCode;

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值