java - 多线程 Android 应用程序中的组件应该如何交互?

标签 java android multithreading oop single-responsibility-principle

我想制作一个简单的 Android 应用程序,它必须在后台执行一些繁重的工作。我对 Android 开发完全陌生,需要有关如何正确设计此应用程序的建议。
因此,我的应用程序需要在后台运行一个服务器,该服务器接受客户端并与客户端持续通信,直到用户决定停止服务器。我有一个简单的 Activity ,其中有一个必须启动和停止服务器的按钮。我目前的想法是:

  • 按下按钮应启动服务
  • 服务必须启动一个单独的线程来完成服务器的所有工作。

我想我应该创建三个类:Activity类,Service类(要求系统运行前台Service这样进程就不会被如果用户关闭 Activity,则被杀死),以及 Server 类,该类可以是 ThreadAsyncTask
问题是服务器线程上可能会发生一些用户应该注意的事件,因此这些事件必须触发 UI 中的一些更改,例如显示消息。我可以通过在 onProgressUpdate() 方法或 runOnUiThread() 中操作 UI 来通知用户,但这感觉不太好。此外,我认为这违反了单一职责原则,因为服务器执行了预期之外的工作。也许我应该以某种方式通知Service,而后者又会完成通知用户的所有工作?
此外,我需要能够以某种方式从 UI 控制服务器。因此,仅仅调用 Service 并忘记它是不可行的。
那么,我的问题是如何做出好的应用程序设计?组件之间应如何交互?

最佳答案

首先,在大多数情况下,Android 设备充当服务器是一个糟糕的设计,因为移动电话提供商目前向其客户端分配私有(private) IP,而不是公共(public) IP,因此您的监听端口将无法从 Internet 访问。 它只能在 LAN 内工作并通过 WiFi 连接。

您的服务器任务并不严格要求在服务中创建,它可以在应用程序的其他类中创建,但如果您希望服务器线程在手机进入休眠状态时不停止,则需要创建服务模式,因此为了避免这种情况,您需要创建一个前台服务(一个调用 startForeground() 的服务)并使用 PowerManager.WakeLock。

要与 UI 线程进行任务通信,我建议您使用消息,为了在 UI 线程中工作,您需要创建 Handler 派生类的实例并覆盖 handleMessage() 方法。

从服务器线程,您可以使用 sendMessage() 向 Handle 派生实例发送消息,并且您将在 UI 线程中的 handleMessage() 中接收它们。

关于java - 多线程 Android 应用程序中的组件应该如何交互?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58251784/

相关文章:

java - fragment 中的Android "Only the original thread that created a view hierarchy can touch its views."错误

安卓 MVVM : How to subscribe to a network call by LiveData in ViewModel

java - EventBus 粘性事件是否在订阅者方法上自动删除?

linux - 如何在运行时将新消息传递给线程函数?

java - Android BluetoothSocket - 超时

linux - 将内存区域限制为线程

Java Sockets 写/读

java - 播放音乐后自动启用按钮

java - Spring MVC -> JSON 响应

android - 如何从浏览器识别设备并检索唯一ID