Android 客户端使用线程与服务器通信的最佳实践

2022-09-03 13:53:50

我正在构建一个Android应用程序,只要该应用程序正在运行,它就会定期与服务器进行通信。

我通过在应用程序启动时启动与服务器的连接来执行此操作,然后我有一个单独的用于接收消息,称为,它从中读取消息,分析它,并将其转发到应用程序的相应部分。threadReceiverThreadthreadsocket

它在循环中运行,读取它必须读取的任何内容,然后在命令上阻塞,直到新数据到达,因此它花费了大部分时间被阻止。threadread()

我处理通过另一个名为 .我想知道的是:我应该以类似的方式构建吗?意思是我应该为这个线程维护一个队列,让它发送队列中的所有消息,然后阻塞直到新消息进入队列,或者我应该在每次需要发送消息时启动线程的新实例,让它发送消息然后“死亡”?我倾向于第一种方法,但我不知道在性能(在内存中保留阻塞线程与初始化新线程)和代码正确性方面,实际上什么更好。SenderThreadSenderThread

另外,由于我的所有活动都需要能够发送和接收消息,因此我持有对类中两个线程的引用,这是一种可接受的方法,还是应该以不同的方式实现它?Application

我遇到的一个问题是,有时如果我关闭应用程序并再次运行它,我实际上有两个 ReceiverThread 实例,所以我会收到一些消息两次。

我猜这是因为我的应用程序实际上没有关闭,并且以前的线程仍然处于活动状态(在操作时被阻止),当我再次打开应用程序时,一个新线程被初始化,但两者都连接到服务器,因此服务器将消息发送给两者。关于如何解决这个问题,或者关于如何完全重新组织它以使其正确的任何提示?read()

我试图查找这些问题,但在我的第一个问题中发现了一些相互矛盾的例子,没有什么足够有用并适用于我的第二个问题......


答案 1

1.如果您确实需要不惜一切代价始终在服务器和客户端之间保持开放连接,您的方法是可以的。但是,我会使用异步连接,例如向服务器发送HTTP请求,然后在服务器感觉像它时得到回复。

如果您需要服务器在以后的某个时候回复客户端,但您不知道何时回复,您还可以查看Google Cloud Messaging框架,该框架为您提供了一种透明且一致的方式,可以从服务器向客户端发送小消息。

在开发移动应用程序时,您需要考虑一些事情。

  1. 智能手机没有无穷无尽的电池电量。

  2. 智能手机的互联网连接有些不稳定,您将在不同时间失去互联网连接。

当您始终保持与服务器的直接连接时,您的应用程序会不断发送保持活动状态的数据包,这意味着您将非常快速地吸干手机。当互联网连接与移动宽带一样不稳定时,您有时会失去连接,需要从中恢复。因此,如果您因为想要确保数据包被接收而使用,则可以多次重新发送相同的数据包,因此会获得很多开销。TCP

此外,如果您自己在服务器上打开线程,则可能会在服务器端遇到线程问题,这听起来像是。假设您有 200 个客户端同时连接到服务器。每个客户端在服务器上打开 1 个线程。如果服务器需要同时为200个不同的线程提供服务,那么对于服务器来说,这可能最终是一个非常消耗性能的任务,您还需要自己做很多工作。

2. 退出应用程序时,您需要在退出应用程序后进行清理。这应该在你的方法中完成,这是活跃的。onPauseActivity

这意味着,杀死所有活动线程(或至少中断它们),保存UI的状态(如果需要),并刷新和关闭与服务器的任何打开连接。

就使用而言,我建议使用一些内置线程工具,如Handlers或实现AsyncTaskThreads

如果你真的认为这是要走的路,我肯定会建议使用单例模式作为线程的“管理器”。Thread

此管理器将控制您的线程,因此即使您处于应用程序的另一部分,也不会在任何给定时间与服务器进行多个会话。Thread

就类实现而言,请查看应用程序类文档Application

需要维护全局应用程序状态的用户的基类。您可以通过在 AndroidManifest.xml 的标记中指定其名称来提供自己的实现,这将导致在创建应用程序/包的进程时为您实例化该类。

通常不需要子类应用程序。在大多数情况下,静态单例可以以更加模块化的方式提供相同的功能。

因此,建议不要实现自己的类,但是如果您让其中一个初始化自己的类来管理和连接,您可能会(只是可能)遇到麻烦,因为单例的初始化可能会“绑定”到特定,因此如果从屏幕中删除特定并暂停,则可能会杀死单例,因此单例也可能被杀死。因此,在实现中初始化单例可能会很有用。ApplicationActivitiesSingletonThreadsActivityActivityApplication

很抱歉有文字墙,但你的问题很“开放”,所以我试图给你一个有点开放式的问题 - 希望它有帮助;-)


答案 2

推荐