gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-10-30 19:55:25 26 4
gpt4 key购买 nike

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

我通过在应用程序启动时启动与服务器的连接来执行此操作,然后我有一个单独的 thread 用于接收名为 ReceiverThread 的消息,这个 threadsocket 中读取消息,对其进行分析,并将其转发到应用程序的适当部分。

这个线程在一个循环中运行,读取它必须读取的任何内容,然后阻塞在read()命令上直到新数据到达,所以它花费了大部分时间时间阻塞。

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

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

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

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

我试着查找这些问题,但发现了一些与我的第一个问题相互矛盾的例子,没有任何一个足够有用并适用于我的第二个问题...

最佳答案

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

如果你需要服务器稍后回复客户端,但你不知道什么时候,你也可以查看Google Cloud Messaging framework ,这为您提供了一种透明且一致的方式,可以从您的服务器向您的客户发送小消息。

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

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

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

当您始终与服务器保持直接连接时,您的应用会不断发送保持 Activity 数据包,这意味着您会很快将手机吸干。当互联网连接像移动宽带一样不稳定时,您有时会失去连接并需要从中恢复。因此,如果你使用 TCP 因为你想确保你的数据包被接收到,你会多次重新发送相同的数据包,因此会产生很多开销。

如果您自己在服务器上打开线程,您也可能会遇到服务器端的线程问题,这听起来像是。假设您有 200 个客户端同时连接到服务器。每个客户端在服务器上打开 1 个线程。如果服务器需要同时服务 200 个不同的线程,这最终对服务器来说可能是一项相当耗费性能的任务,您也需要自己做很多工作。

2. 当您退出应用程序时,您需要进行清理。这应该在处于 Activity 状态的 ActivityonPause 方法中完成。

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

就使用Threads 而言,我建议使用一些内置的线程工具,例如Handlers。或实现 AsyncTask .

如果您真的认为 Thread 是正确的选择,我绝对会推荐使用 Singleton pattern作为线程的“经理”。

该管理器将控制您的线程,因此即使您在应用程序的另一部分,您也不会在任何给定时间结束时有多个 Thread 与服务器通信。

Application 类实现而言,请查看 Application class documentation :

Base class for those who need to maintain global application state. You can provide your own implementation by specifying its name in your AndroidManifest.xml's tag, which will cause that class to be instantiated for you when the process for your application/package is created.

There is normally no need to subclass Application. In most situation, static singletons can provide the same functionality in a more modular way.

因此,建议不要实现您自己的 Application 类,但是如果您让您的 Activities 之一初始化您自己的 Singleton 类管理 Threads 和连接您可能(只是可能)遇到麻烦,因为单例的初始化可能会“绑定(bind)”到特定的 Activity,因此如果特定的 Activity 从屏幕上移除并暂停它可能会被杀死,因此单例也可能会被杀死。因此,在您的 Application 实现中初始化单例可能会被认为是有用的。

抱歉,文字太长,但您的问题相当“开放”,所以我试着给您一个有点开放的问题 - 希望对您有所帮助 ;-)

关于java - android客户端使用线程与服务器通信的最佳实践,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18303891/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com