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