我的应用程序具有用户交互活动和后台服务,数据模型只在后台服务中进行修改。后台服务监听来自用户的操作以及来自网络的传入消息,因此可能会出现并发问题,我尝试使用处理程序来防止这种情况发生。我使用Greenrobots Eventbus作为事件层。
这一切都运行良好,但我想知道是否有更智能/更快/代码更简单(因此错误更少)的方法来处理这种用例?
具体而言:
在oncreate方法中,我注册服务(对于活动,我在onstart中执行此操作)。
在onDestroy中,我再次执行取消注册:
每当我对一个传入事件做出反应时,我希望确保串行执行,因为可能会存在并发问题,因为有来自用户交互以及通过网络来自其他用户的传入事件。因此,我决定使用处理程序:
对于每个感兴趣的事件,我都有一个onEvent方法,它没有做什么,只是将事件传递给处理程序,以通过一个小的“passToHandler”辅助函数实现串行执行。
“process…”方法是“数据魔力”发生的地方,对于我的问题并不相关。当然,对于每个可能的事件,我都创建了一个类,通常很简洁,就像这样:
这一切都运行良好,但我想知道是否有更智能/更快/代码更简单(因此错误更少)的方法来处理这种用例?
具体而言:
- 是否有一种方法可以确保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);
}
每当我对一个传入事件做出反应时,我希望确保串行执行,因为可能会存在并发问题,因为有来自用户交互以及通过网络来自其他用户的传入事件。因此,我决定使用处理程序:
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);
}
“process…”方法是“数据魔力”发生的地方,对于我的问题并不相关。当然,对于每个可能的事件,我都创建了一个类,通常很简洁,就像这样:
public class JoinParty {
private String partyCode;
public JoinParty(String partyCode) {
super();
this.partyCode = partyCode;
}
public String getPartyCode() {
return partyCode;
}
}