小编Mar*_*ark的帖子

Android破坏活动,查杀进程

嗨,我想知道Android如何管理内存,我无法在任何地方找到准确的答案.假设我有一个应用程序在当前活动堆栈上有5个活动(4个被停止,1个被恢复),没有连接服务.我按下HOME按钮,以便停止所有活动.我启动了一些其他内存消耗应用程序,整体设备内存开始变低.问题是

......我的申请会怎样?

  1. 系统可以只销毁我的一个或一些活动来恢复内存吗?
  2. 系统会杀死我申请的整个过程吗?所有的活动都会被很好地摧毁吗?
  3. 当我完全杀死我的应用程序时会发生什么?它会从开始(如第一次开始)开始,还是会尝试将活动恢复到正常状态/如果是 - 它只是堆栈顶部的那个还是全部?

更新:

在提出这个问题之前,我已经看过几次Activity生命周期,但它没有我的问题的答案.我做了一些测试,我有一些答案.DDMS中的"停止过程"是测试的线索.

我没有测试问题1的答案,但正如指南所说:

如果某个活动暂停或停止,系统可以通过要求完成活动或仅删除其进程来从内存中删除活动.

似乎可以轻轻地销毁一个或多个活动(使用onDestroy方法)而不会终止进程.回到它们时,您将获得(onCreate + bundle).

问题2答案:

是.通常系统杀死整个过程,这意味着包括活动和静态字段在内的所有数据都被销毁.这样做不是很好 - 你不会为任何暂停/停止的活动获得onDestroy或finialize().这就是在onPause方法之前调用saveInstanceState()的原因.onPause基本上是你应该保存的最后一个方法,因为在这个方法之后你永远不会看到onStop或onDestroy.系统可以扼杀破坏所有物体的过程,无论它们持有什么以及它们正在做什么.

问题3答案:

当你回到被杀的应用程序时会发生什么?

  • 在Android 2.2之前 - 应用程序将从具有启动器活动的开始启动.
  • 从2.2开始 - 系统将恢复先前的应用程序状态.这是什么意思?这意味着将重新创建最后一个可见活动(onCreate + bundle).活动堆栈会发生什么?堆栈很好但是它上面的所有活动都已经死了.当您使用后退按钮返回时,每个都将被重新创建(onCreate + bundle).还有一件事:

通常,当用户从主屏幕重新选择该任务时,系统会在某些情况下清除任务(从根活动上方的堆栈中删除所有活动).通常,如果用户未访问任务一段时间(例如30分钟),则完成此操作.

结论?

  1. 不要认为处理活动轮换问题可以通过android解决:configChanges ="orientation".当你这样做时,你会得到许多你甚至都不知道的问题.
  2. 使用DDMS测试应用程序 - 停止进程按钮.看到这个
  3. 使用静态变量时要小心.不要认为当你在活动1中初始化它们时 - 你将在活动2中初始化它们.初始化全局静态的唯一安全的地方是Application类.
  4. 请记住,您可能永远不会看到onStop或onDestroy.关闭文件/数据库,在onPause中停止下载.当您希望应用程序在BG中执行某些操作时 - 请使用前台服务.

那将是它...希望我帮助我的essey :)

android android-activity

116
推荐指数
1
解决办法
5万
查看次数

CQRS 在 NoSql (Mongo DB) 中读取模型

大家好,这是我第一次使用 DDD/CQRS。我已经阅读了多种知识来源,但我仍然有点困惑,也许有人可以提供帮助:)

让我们假设一个简单的情况,我们有产品和客户(可能是不同的有界上下文)。客户可以购买产品,并且他希望查看他购买的所有产品。

在这种情况下,我意识到我需要一个UserPurchasesView视图模型:

  • purchaseId(这是一个mongo主键)
  • 用户身份,
  • 产品:{id,名称,图像,shortDescription,[也许还有其他一些]}
  • 时间戳

现在...问题是我的域正在生成类似UserPurchasedProduct(userId, ProductId) 的事件。我可以用奖品、产品名称或其他东西来丰富活动,但不是所有领域。我已经到了这样一个地步:丰富似乎是错误的。

在这一点上,我意识到我需要类似ProductDetailsView的东西:

  • 产品 ID(主键)
  • 姓名
  • 简短的介绍
  • 标识

该视图由以下事件维护:ProductCreated、ProductRenamed、ProductImageChanged

现在我们有两个选择......

  1. 当 UserPurchasedProduct 事件发生时,查看 ProductDetailsView,获取所有需要的产品详细信息并将其保存在 UserPurchasesView 中以便更快地读取。这个解决方案看起来不错,但它引入了一些额外的耦合,在我看来,这些视图在需要时无法很好地扩展。此外,在回复事件存储中的所有事件时,必须一起重建两个视图(在这种情况下重建也更加棘手)。
  2. 仅将 ProductId 保留在 UserPurchasesView 中,并在用户查询其购买时读取多个视图。这是一些必须在某处完成的额外处理。在前端、后端控制器或某些读取模型高级 API 中。更新:我还意识到,我还需要至少在 UserPurchasesView 中保留奖品,也许还有产品名称(以防发生变化),但有时您需要购买时的价值,有时您需要最近的价值。场景取决于业务,但我们可以想象两者。

这些解决方案在我看来都不完美。我是错了吗,我错过了什么还是这只是做到这一点的方法?谢谢!

domain-driven-design cqrs

6
推荐指数
1
解决办法
4350
查看次数