【问题标题】:Should there be any logic on the activity class?活动类上应该有任何逻辑吗?
【发布时间】:2016-02-25 20:25:51
【问题描述】:

我最近在阅读有关设计模式的文章,尤其是有关低耦合和委托的文章。

我想知道,Activity 类是否应该有任何逻辑,或者它是否只服务于视图。

例如我有一个名为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");
            }
        });
    }

【问题讨论】:

  • 您正在涉足关于应用架构的高度评价领域,并且有很多方法可以满足您的要求,但没有一种方法比另一种更正确或更不正确。跨度>
  • 在你的Activity中加入逻辑当然不是坏事。 Activity 仅用于运行应用程序的该部分,包括实例化视图、操作它们、处理用户输入等。作为开发人员,您的工作是确定一个类中有多少逻辑是太多逻辑。这基本上取决于您自己的个人喜好。如果您觉得某些任务可以分成单独的类,那就去做吧。否则,请在 Activity 本身中执行您需要的操作。
  • 我希望有一个或两个正确的方法......无论如何,谢谢你对我的问题的轻微澄清:)
  • 我同意道格的观点,这是一个非常自以为是的问题。实际上,您可能会发现,是的,您将在 Activity 中执行逻辑,而不管您实现了哪种 POSA 模式。需要有一些与活动相关的逻辑,多少?好吧,这取决于您的实施
  • 谢谢大家的热心回复,很有道理。

标签: java android design-patterns


【解决方案1】:

在活动中放置大量逻辑并不是特别糟糕,但你尝试让它只查看相关的东西是正确的。如果应用程序相对较小,则可能不值得将逻辑移出。还有一些overhead to using abstractions

如果你的抽象没有提供显着的好处,你应该避免它们

我尝试将任何大数据对象保存在管理器类中,因此根据您的示例,可能值得创建一个 Battle 管理器类来保存其中涉及的所有逻辑,例如 postCastedSpell 函数。这样一来,所有的战斗信息都是自包含的,也可以在其他活动中使用。

请记住,如果您使用数据管理器类并且希望它们提示与 UI 进行某种交互,则必须使用 CallbacksBus pattern,因为战斗管理器不会可以访问您的 UI。例如,要调用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。

【讨论】:

  • 感谢您的回答。只是为了澄清,如果我创建一个对象,假设 Manager 是使用回调与 UI 一起工作的正确方法吗?如果我传递一个上下文对象怎么办?还是活动对象,然后我调用该活动中的方法来更新 UI?您对这些问题的回答对我有很大帮助。
  • 虽然您在技术上可以这样做,但您希望尽量避免在其他持久类之间引用您的活动。这是因为您希望您的活动在其消失后的某个时间点收集垃圾。如果您的 BattleManager 始终存在并持有对您的活动的引用,则活动将永远不会被垃圾收集。关于这个垃圾收集,我还添加了一个关于如何处理这个问题的编辑,如果它在你的回调返回之前被收集。
  • 感谢您的所有回答。你帮了很多忙!
猜你喜欢
  • 2012-07-19
  • 1970-01-01
  • 2018-04-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-06
  • 1970-01-01
  • 2010-12-01
相关资源
最近更新 更多