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

Java 如何在Android中共享活动中的大型对象?,java,android,Java,Android,我有一个网络客户端类,它接收一个大的二进制块并将其解析为一个可用的Java对象。网络客户端位于应用程序视图的独立线程上。使此对象可供视图使用的最佳方法是什么?我提出了以下解决方案,但我觉得没有一个是正确的: 在网络客户端中创建对象,并让视图直接访问它 我会在处理程序中发送一条小消息,告诉视图数据已经更新 Con:需要在线程之间同步对象,以确保在视图访问对象时,网络客户端不会替换该对象 序列化包裹?对象,并通过处理程序将其发送到视图 赞成:不存在数据所有权的问题 缺点:可能会对应用程序造成巨大的性

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

在网络客户端中创建对象,并让视图直接访问它 我会在处理程序中发送一条小消息,告诉视图数据已经更新 Con:需要在线程之间同步对象,以确保在视图访问对象时,网络客户端不会替换该对象 序列化包裹?对象,并通过处理程序将其发送到视图 赞成:不存在数据所有权的问题 缺点:可能会对应用程序造成巨大的性能消耗 创建对对象的引用并将其传递给视图 我来自C++背景,我不知道这是否在java中是可能的。我C++,我可以把视图指向对象,让它来处理它。这似乎是Java不允许我做的事情。这是否可行?
这些解决方案是否可取,或者我是否应该以完全不同的方式解决问题?

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


如果您确实希望在活动处于后台时继续下载,则可能需要使用服务。您可以使对象可被包裹或其他方式;我认为,如果您的活动和服务在同一个流程中,那么底层服务实现会传递指针。我认为默认情况下,它们在同一个流程中,但是ICBW。

如果对象非常大,并且您不愿意使用get方法返回它,也许您可以将其内容放入SQLite数据库,并有选择地将其作为ContentProvider公开。您还可以发送一个意图,然后让视图去抓取有效负载或将其附加到意图上。

查看该类的子类,在清单中引用该类将使您能够将对服务/下载控制器的引用存储在中心位置,该位置将在每个活动中可用你的应用程序。这使您能够将数据保留在内存中,并且如果需要在多个位置而不是仅在一个活动中重新创建大对象,则可以减少重新创建大对象的需要

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


还要记住,让注释向用户显示某项服务正在执行某些操作,并让用户访问该服务并取消该服务或查看其状态,这是一种很好的做法

这是一个很好的问题,我没有考虑太多。我想我的网络客户端需要是一个服务;如果我不是在后台下载,当应用程序恢复时,我正在监听的套接字将完全充满旧数据。因为我要将网络客户端转换为服务,它需要打包它希望与活动共享的任何数据,对吗?没有其他方法了?如果您使用的是本地服务,您可以创建getter和setter,并像其他对象一样与服务通信。搜索本地服务获取更多信息。正如我所说的,这取决于。如果它们在同一进程中运行,我认为底层实现将尝试传递指针,而不是复制数据。谢谢大家!回答得好,但我希望避免使用SQLite这样的外部存储。您不必将外部存储与SQLite一起使用,您可以使用/data/data/com.domain.appname/目录。有关更多信息,请参阅此链接: