gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 23:42:42 24 4
gpt4 key购买 nike

我想制作一个简单的 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/

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