组件应如何在多线程Android应用程序中进行交互?

问题描述 投票:0回答:2

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

  • 按下按钮应启动服务
  • 该服务必须启动一个单独的线程,该线程将完成服务器的所有工作。
我想我应该创建三个类:Activity类,Service类(要求系统运行前台Service,以便在用户关闭Activity时不会杀死进程),以及Server类可以是ThreadAsyncTask。问题在于,某些事件可能会在用户应注意的服务器线程上发生,因此这些事件必须触发UI中的某些更改,例如显示一条消息。我可以通过在onProgressUpdate()方法或runOnUiThread()中操作UI来通知用户,但感觉很不错。此外,我认为这违反了单一职责原则,因为服务器执行了预期之外的工作。也许我应该以某种方式通知Service,这又将做所有工作来通知用户?而且,我需要能够以某种方式从UI控制服务器。因此,仅调用Service并忘记它是不可行的。因此,我的问题是如何对应用程序进行良好的设计?组件之间应如何相互作用?
java android multithreading oop single-responsibility-principle
2个回答
0
投票

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

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

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

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


0
投票

[如果您想与组件进行交互,例如您已在后台在服务中执行某些任务或从服务器获取通知,并且您想在活动中通知或更新UI或此处想要的任何内容,或在前台的片段(如消息等) ..那么您可以使用广播接收器

您需要在想要的活动或片段中使用特定操作名称注册接收者

然后通过意图从服务类发送包含具有特定操作名称的内容或数据的广播

您在活动或片段中声明的广播接收器onReceive方法上具有动作和意图的事件触发,您可以通过从意图中获取数据来从此处更新UI,>

阅读android开发者官方文档的广播概述

https://developer.android.com/guide/components/broadcasts希望对您有帮助

© www.soinside.com 2019 - 2024. All rights reserved.