我最近在阅读有关设计模式的内容,特别是关于低耦合和委派的内容。
我想知道,Activity
课程中是否应该有任何逻辑,或者它是否只提供视图。
E.g。我有一个名为BattleActivity
的活动,它可以作为两个玩家之间的某种会话。很多Push Notifications
发生在那里,同时这个类也是Observer
,所以那里会有很多的粉碎。
现在我想弄清楚我可以将什么逻辑移到一个单独的对象(以及我是否应该),然后只使用该活动。
我对该活动的一种方法示例:
private void postCastedSpell(final int spellId) {
Call call = StaticGlobalContainer.api.postSpellToBattle(Integer.parseInt(battleId), Integer.parseInt(MainActivity.CURRENT_USER_ID), spellId, 100);
call.enqueue(new Callback<User>() {
@Override
public void onResponse(Response<User> response, Retrofit retrofit) {
User user = response.body();
if (response.code() == 202) {
// 200
Log.i("Posting spell to battle", "Success");
Boolean affectedUserIsOpponent = isUserOpponent(user);
if (affectedUserIsOpponent && user.currentHp<1){
StaticGlobalContainer.battleOnResult(Constants.WON, getApplicationContext());
}else {
updateBattleLog(affectedUserIsOpponent, user, spellId);
}
// TODO: do something here
} else {
// 404 or the response cannot be converted to User.
Log.e("Posting spell to battle", "Error:" + response.errorBody());
}
}
@Override
public void onFailure(Throwable t) {
Log.i("HttpRequest-Post spell", "Failure");
}
});
}
答案 0 :(得分:1)
在“活动”中加入大量逻辑并不是特别糟糕,但是你只是试图让它只查看相关内容。如果应用程序相对较小,则可能不值得将逻辑移出。此外,还有一些overhead to using abstractions。
如果你的抽象没有提供显着的好处,你应该避免它们
我尝试在管理器类中保留任何大数据对象,因此,根据您的示例,创建一个Battle
管理器类以保存其中涉及的所有逻辑可能是值得的,例如postCastedSpell
功能。这样,所有战斗信息都是自包含的,也可以在其他活动的其他地方使用。
请记住,如果您使用数据管理器类并且希望它们提示与UI进行某种交互,那么您必须使用Callbacks或{{3}因为战斗经理无法访问你的用户界面。例如,要调用postCastedSpell
,调用将如下所示:
的 BattleActivity 强>:
BattleManager bm = BattleManager.getInstance(user1, user2);
onSpellClicked() {
bm.castSpell(spellId, user1, callback)
}
BasicCallback callback = new BasicCallback() {
@Override
onComplete() {
if (MyInfoFragment.this.isVisible()) {
[Update UI]
}
}
};
注意:当使用像我的示例之类的回调时,当它最终被调用时,活动可能已经不在视图中并且已经被垃圾收集了。因此,在回调函数中,您需要首先确保它仍然可见,然后再尝试修改可能不再存在的UI。