活动课上应该有任何逻辑吗?

时间:2016-02-25 20:25:52

标签: java android design-patterns

我最近在阅读有关设计模式的内容,特别是关于低耦合和委派的内容。

我想知道,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");
            }
        });
    }

1 个答案:

答案 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。