我想制作一个简单的 Android 应用程序,它必须在后台执行一些繁重的工作。我对 Android 开发完全陌生,需要有关如何正确设计此应用程序的建议。
因此,我的应用程序需要在后台运行一个服务器,该服务器接受客户端并与客户端持续通信,直到用户决定停止服务器。我有一个简单的 Activity ,其中有一个必须启动和停止服务器的按钮。我目前的想法是:
- 按下按钮应启动服务
- 服务必须启动一个单独的线程来完成服务器的所有工作。
我想我应该创建三个类:
Activity
类,Service
类(要求系统运行前台Service
这样进程就不会被如果用户关闭 Activity,则被杀死),以及 Server
类,该类可以是 Thread
或 AsyncTask
。问题是服务器线程上可能会发生一些用户应该注意的事件,因此这些事件必须触发 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/