【问题标题】:Android Intent and startActivity still necessary for calling static methods?Android Intent 和 startActivity 仍然需要调用静态方法吗?
【发布时间】:2011-06-08 22:46:45
【问题描述】:

我想我已经知道这个问题的答案了,因为看起来,呃,会有点牵强。但我正在认真寻找解决方案。

假设我有一个 Activity,称之为蓝牙 Activity,它启动一个蓝牙后台线程,即使蓝牙 Activity 消失,该线程也会永远运行 - 是的,它确实永远运行。 这个蓝牙后台线程是一个数据采集线程,它不断地实时收集要由 Activity 绘制的数据,称为 Plot Activity。我们可以将绘图方法称为静态方法,称为 Plot.plotData();

我的问题是我无法确定 Plot 活动何时处于活动状态,因此我无法确定何时开始调用 Plot.data()。您可能会认为,由于 Plot.plotData() 是一个静态方法,我可以随时调用它。但并非如此。我必须等到 Plot 通过 Intent() 和 startActivity 实例化。否则 Plot 的 onCreate() 方法没有被调用,并且 Plot 充满了空指针。

我该如何解决这个问题。添加一个静态 getter/setter,在 onCreate 运行之前它最初为 false?

【问题讨论】:

  • 您的方法似乎是倒退的。 PlotActivity 不应该启动绘图吗?

标签: android static static-methods


【解决方案1】:

假设我有一个 Activity,称之为蓝牙 Activity,它启动一个蓝牙后台线程,即使蓝牙 Activity 消失,该线程也会永远运行 - 是的,它确实会永远运行。

它不会,除非你把它放在Service 中。请不要从Activity 泄漏线程。

请注意,您已经拥有been told

我们可以将绘图方法称为静态方法,称为 Plot.plotData();

这不应该是静态方法,如I told you before

我的问题是我无法确定 Plot 活动何时处于活动状态,因此我无法确定何时开始调用 Plot.data()。

这就是为什么Plot 活动应该负责自己的绘图。 Service 中的后台线程应该单独处理数据收集。您可以安排通过MessengerbindService() 和回调或其他方式将数据从Service 获取到Plot 活动。

执行数据收集和显示结果的活动的服务设计在 Android 中很普遍。电子邮件客户端使用服务来收集新的电子邮件消息。提要阅读器使用服务来收集最新的提要更新。等等。您只是碰巧通过蓝牙收集信息,而这个概念的大多数示例将通过 Internet 收集信息。

所以,回顾一下:将您的蓝牙数据收集逻辑移动到Service,使用后台线程(或线程,复数,如果需要)。安排Service 在数据到达时将数据传送到Plot 活动。让Plot 活动显示结果。

【讨论】:

  • 我可以发誓我最近几次听说过这个问题。 +1 用于普通软件,-1 用于不接受建议的海报...
  • 我被指向此代码并要求对其进行修改。一个文件有 3300 多行,我很难理解。您说:“将您的蓝牙数据收集逻辑移动到服务中。”如果我能的话我会的。我正在将代码重构为更小的文件。但据我所知,我的蓝牙数据收集“逻辑”确实是一个线程,我利用它来绘制不断传入的数据(删除最旧的点,添加最新的点,然后重绘)。当蓝牙活动消失时,线程似乎会挂起以绘制数据。这就是线程泄漏的意思吗?
  • @Eric 这是您第一次看到这个具体问题。这是我第一次专门询问简单的传统 getter()/setter() 是否可以解决检测我的 Plot 活动是否处于活动状态的问题。
猜你喜欢
  • 2021-07-01
  • 1970-01-01
  • 2011-02-06
  • 2015-09-06
  • 2012-04-15
  • 1970-01-01
  • 2021-05-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多