- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我正在构建一个 Android 应用程序,只要该应用程序正在运行,它就会定期与服务器通信。
我通过在应用程序启动时启动与服务器的连接来执行此操作,然后我有一个单独的 thread
用于接收名为 ReceiverThread
的消息,这个 thread
从 socket
中读取消息,对其进行分析,并将其转发到应用程序的适当部分。
这个线程
在一个循环中运行,读取它必须读取的任何内容,然后阻塞在read()
命令上直到新数据到达,所以它花费了大部分时间时间阻塞。
我通过另一个称为 SenderThread
的线程处理发送消息。我想知道的是:我应该以类似的方式构造 SenderThread
吗?意思是我应该为这个线程维护某种形式的队列,让它发送队列中的所有消息然后阻塞直到新消息进入队列,或者我应该在每次需要发送消息时启动一个新的线程实例,让它发送消息然后“死”?我倾向于第一种方法,但我不知道在性能(在内存中保留阻塞线程与初始化新线程)和代码正确性方面实际上更好的是什么。
此外,由于我的所有 Activity 都需要能够发送和接收消息,所以我在我的 Application
类中持有对两个线程的引用,这是一种可接受的方法还是我应该以不同的方式实现它?
我遇到的一个问题是,有时如果我关闭我的应用程序并再次运行它,我实际上有两个 ReceiverThread 实例,所以我会收到两次消息。
我猜这是因为我的应用程序并没有真正关闭,之前的线程仍然处于 Activity 状态(在 read()
操作上被阻塞),当我再次打开应用程序时,一个新线程已初始化,但两者都已连接到服务器,因此服务器将消息发送给两者。有关如何解决此问题或如何完全重新组织它以使其正确的任何提示?
我试着查找这些问题,但发现了一些与我的第一个问题相互矛盾的例子,没有任何一个足够有用并适用于我的第二个问题...
最佳答案
1. 如果您真的需要不惜一切代价始终保持服务器和客户端之间的开放连接,您的方法是可以的。但是我会使用异步连接,比如向服务器发送 HTTP 请求,然后在服务器需要时得到回复。
如果你需要服务器稍后回复客户端,但你不知道什么时候,你也可以查看Google Cloud Messaging framework ,这为您提供了一种透明且一致的方式,可以从您的服务器向您的客户发送小消息。
在开发移动应用程序时,您需要考虑一些事情。
智能手机没有无穷无尽的电池。
智能手机的互联网连接有些不稳定,您会在不同时间断开互联网连接。
当您始终与服务器保持直接连接时,您的应用会不断发送保持 Activity 数据包,这意味着您会很快将手机吸干。当互联网连接像移动宽带一样不稳定时,您有时会失去连接并需要从中恢复。因此,如果你使用 TCP
因为你想确保你的数据包被接收到,你会多次重新发送相同的数据包,因此会产生很多开销。
如果您自己在服务器上打开线程,您也可能会遇到服务器端的线程问题,这听起来像是。假设您有 200 个客户端同时连接到服务器。每个客户端在服务器上打开 1 个线程。如果服务器需要同时服务 200 个不同的线程,这最终对服务器来说可能是一项相当耗费性能的任务,您也需要自己做很多工作。
2. 当您退出应用程序时,您需要进行清理。这应该在处于 Activity 状态的 Activity
的 onPause
方法中完成。
这意味着,终止所有 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/
大多数语言都支持双向进程通信。例如,在 Python 中,我可以(草率地)执行以下操作: >>> from subprocess import * >>> p = Popen('nslookup',
致力于使用 C++ 在 arduino 和 PC (Win 7) 之间进行通信。使用 WriteFile 和 ReadFile 创建通信或简单地发送或接收数据没有问题。但是当我想以某种方式“协调”沟通
我们正在开发一个基于微服务的应用程序。它们将使用 Helm Package Manager 部署到 kubernetes,并且它们都存储了自己的存储库和 helm chart。以下是我们微服务的名称。
我正在开发一个大型 MVVM 应用程序。我为此使用了 MVVM 轻量级工具包。该应用程序就像一个带有后退和前进按钮的网络浏览器。主视图是一个用户控件。我在主视图用户控件中放置了后退和前进按钮。主视图又
我在 java 和 freepascal(lazarus) 应用程序之间的通信有问题。我使用套接字。它们正确连接。一切都很顺利,直到我想从一个应用程序向另一个应用程序发送一些东西。在java而不是“a
我已经使用客户端套接字和服务器套接字使用C#编写了群聊。 当我使用VS 2017在自己的PC中运行程序(服务器和客户端)时,客户端和服务器之间的通信工作正常。 当我在笔记本电脑中运行客户端程序,并在自
Kubernetes 中两个不同 Pod 之间的通信是如何发生的? 就我而言,我有两个 Pod:前端和后端,它们都有不同的容器。 我希望我的前端 pod 与后端 pod 通信,但我不想使用后端 pod
我正在尝试在浏览器中嵌入的 flash 实例与在 C# WinForms 应用程序中运行的 flash 实例之间进行通信...我收到一个编译错误,内容为: 1119 Access of possibl
鉴于网络上缺乏信息,请问一个问题:我要在 Android 中创建一个应用程序,使用一个数据库应用程序 rails 。为此,我需要一个手动 session 。所以如果有人准备好了示例/教程显示通信 an
我正在编写一个应用程序,它将通过 MySQL 数据库对用户进行身份验证。我已经用 Java (android) 编写了它,但现在正在移植到 Windows 手机。 PHP 文件使用 $get 然后回显
是否可以通过互联网在两个不同设备上的两个不同应用程序之间建立通信。我想从设备 A 上的应用程序点击一个设备 B 上的应用程序,然后从设备 B 上的应用程序获取数据到设备 A 上的应用程序。如果可能,如
这是脚本: 它被放置在其他网站上。 com 并显示一个 iframe。如果有人点击 iframe 中的某个内容,脚本应该将一个 div 写入 othersite 。 com. 所以我的问题是如何做到
你好我是 php 的新手,我用 c++ 编写了整个代码并想在 php 中使用这段代码。所以我为我的代码制作了 dll 以使用它。但是我不能在 php 中使用这个 dll,可以谁能给我完整的代码来使用
我确定之前已经有人问过(并回答过)此类问题,所以如果是这样,请将我链接到之前的讨论... 在 C++ 中,假设我有一个 ClassA 类型的对象,其中包含一个 ClassB 类型的私有(private
我正在尝试使用 ATmega32 进行串行通信。首先,我使用 RS232,使用 USB-to-RS232 建立使用串行终端的接收和传输(在我的例子中是 tera 术语)。无论我从串行终端 Atmega
我找不到适用于 Ruby 的 SSL 实现。 我的部分项目需要服务器和客户端之间的安全通信链接,我希望为此使用 SSL 以创建安全 session 。 谢谢 最佳答案 如果你使用 Ruby 1.9.x
我正在尝试在客户端/服务器之间进行 SSL 通信。 到目前为止,我已经从 keystore 创建了 java.security.cert.X509Certificate。接下来我应该怎么做才能使这次沟
我在与 Windows 上的 USB 设备 通信时遇到问题。我不能使用 libusb 或 WinUSB,因为我有一个特定的驱动程序(Silabs USB 到 UART,这是一个 USB 到串口的桥接器
按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the
我发现 xcom 实际上是将数据写入数据库并从其他任务中提取数据。我的数据集很大,将其腌制并写入数据库会导致一些不必要的延迟。有没有办法在不使用 xcom 的情况下在同一 Airflow Dag 中的
我是一名优秀的程序员,十分优秀!