如何在Android中的活动中共享大型对象?

时间:2010-08-16 02:54:33

标签: java android

我有一个Network Client类,它接收一个大的二进制块并将其解析为可用的Java对象。网络客户端位于应用程序视图的单独线程上。将此对象提供给View的最佳方法是什么?我想出了以下解决方案,但我觉得它们都不是正确的解决方案:

  1. 在网络客户端中创建对象,让View直接访问它
    • 我会在Handler中发送一条消息,告诉View该数据已更新
    • Con:要求我在线程之间同步对象,以确保在View访问它时网络客户端不替换该对象
  2. 序列化(包裹?)网络客户端中的对象,并通过处理程序将其发送到视图
    • 专业:没有数据所有权的问题
    • Con:可能是应用程序的巨大性能消耗
  3. 创建对象的引用并将其传递给View
    • 我来自C ++背景,我不确定这在Java中是否可行。在C ++中,我可以向View发送指向对象的指针并让它处理它。这似乎是Java不允许我做的事情。这可行吗?
  4. 这些解决方案是否可取,或者我应该以完全不同的方式解决问题?

3 个答案:

答案 0 :(得分:0)

如果您不想在活动在后台时继续下载,请使用非阻塞IO,而不是线程。

如果您确实希望在活动在后台时继续下载,则可能需要使用服务。你可以使对象Parcelable左右;我认为如果你的活动和服务在同一个进程中,底层服务实现会传递指针(我认为它们是默认的,但是ICBW)。

答案 1 :(得分:0)

如果对象非常大并且您不方便使用get方法返回它,也许您可​​以将其内容放入SQLite数据库并可选择将其作为ContentProvider公开。你也可以发送一个Intent,然后让View继续抓取有效载荷或将它附加到Intent。

答案 2 :(得分:0)

查看此类的application类子类,并在清单中引用它将使您能够将对服务/下载控制器的引用存储在应用程序的每个活动中都可用的中心位置。这使您可以将数据保留在内存中,并且如果您需要在更多地方只需要一个活动,就可以减少重新创建大对象的需要。

对于下载,您可以使用通过活页夹对象与您的活动进行通信的本地service。请记住,服务不是一个线程。如果要在后台运行下载,则需要在服务的oncreate方法中创建一个线程。

另请注意,最好让注释向用户显示服务正在执行某些操作并让他访问服务并取消服务或查看服务状态。