我的应用程序具有用户交互活动和后台服务,这是修改数据模型的唯一地方。后台服务侦听用户所做的操作以及来自网络的传入消息。因此可能会出现并发问题,我试图通过使用处理程序来防止这些问题。对于事件层,我使用 greenrobots Eventbus。
这一切都很好,但我想知道是否有更智能/更快/更少代码扩展(因此更不容易出错)的方式来处理这个用例?
更加具体:
- 有没有办法确保在没有处理程序的情况下串行执行 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);
}
“过程..”方法是“数据魔法”发生的地方,不应该与我的问题相关。
当然,对于每个可能的事件,我确实创建了一个通常非常苗条的类,如下所示:
public class JoinParty {
private String partyCode;
public JoinParty(String partyCode) {
super();
this.partyCode = partyCode;
}
public String getPartyCode() {
return partyCode;
}
}