【问题标题】:IntentService, Service, or AsyncTaskIntentService、Service 或 AsyncTask
【发布时间】:2013-02-21 10:28:31
【问题描述】:

实现这一点的最佳方法是什么。我有一个 Android 应用程序,它将使用我的 python 服务器来允许两部手机之间进行轮次通信。回合意味着他们在回合开始之前不能互相交谈,一旦他们发送消息,他们就不能发送另一个消息,直到对方做出回应,然后才会开始新的回合。

我想我会使用 IntentService,但让服务器不断启动和停止似乎是错误的,我不必担心 asynctask 的问题,或者这是处理它的最佳方式。我怎么能有一个应该接收和发送消息给客户端的服务,似乎服务更多的是一种方式?

【问题讨论】:

    标签: android


    【解决方案1】:

    Intent 服务只不过是由 Intent 触发的工作线程,在单独的线程中执行其操作,然后被关闭。它们旨在启动和停止。

    如果您需要执行诸如 http get 之类的操作,或者在任何情况下不需要与服务器保持连接的交互,请使用意图服务并使用广播事件通知您的活动。

    如果您的应用需要与服务器保持连接(即永久 tcp 连接),我会采用的方法是使用 asynctask 或更经典的方式执行网络任务的服务(不是意图服务)服务中托管的线程。然后,您可以使用 bindToService() 使活动与服务交互。

    我建议不要在活动中使用异步任务。正如 oneilse14 在他的回复中所说,如果水平/垂直视图发生变化,您将面临失去服务器响应的风险。

    【讨论】:

    【解决方案2】:

    我强烈推荐 IntentService/Broadcast Receiver 路由。避免与 AsyncTask 相关的令人讨厌的配置更改问题将使您的生活轻松十倍。

    【讨论】:

    • 我明白了,但是带有消息的标准线程不也可以解决问题吗?即使在配置更改之后,活动也会收到来自后台线程的消息,不是吗?
    • 线程将保留对原始上下文的引用。如果您在配置更改后重新注册上下文/处理程序,您可以解决这个问题,但接收器路由仍然更容易。
    【解决方案3】:

    据我了解,您的问题属于工人队列模型生产者消费者模型)。 Intentservices 就是为了做到这一点。当且仅当您需要执行多线程时,您应该使用服务。您确实可以使用 IBinder 接口与 Activity 和 Service 进行通信。

    Asynctask 只是一个专门的线程,因此您可以轻松地更新您的 UI。但是对于您的情况, IntentService 似乎是最好的选择。

    【讨论】:

    • 你错了: * 请注意,服务与其他应用程序对象一样,在其托管进程的主线程中运行。这意味着,如果您的服务要执行任何 CPU 密集型(例如 MP3 播放)或阻塞(例如网络)操作,它应该生成自己的线程来完成这项工作。 * 服务不是线程。它本身不是一种脱离主线程工作的方法(以避免应用程序无响应错误)。因此,当且仅当您需要多线程时,它不是。
    • IntentService 在后台使用 AsyncTask 来处理主线程 @roiberg 之外的处理。
    • @roiberg 正确。服务将在主线程上工作。为了让这个答案更清楚,服务对于多线程(线程池)或在后台保持序列化的执行程序/处理程序线程非常有用。
    【解决方案4】:

    我会使用通过AlarmManager 安排的警报,因为它可以设置为检查回合是否已经开始/转弯。它具有服务的优势,但没有电池耗尽的恐惧。警报应该运行的频率需要一个频率,甚至包括时间枚举(例如 1 小时/天/周)。

    当警报运行时,它可以轮询以查看当前状态并做出相应反应。例如,通知可以进入状态栏,手机可以发出声音和振动。这样做的好处是用户不必保持应用程序运行,因为警报会触发广播接收器。

    报警代码示例:http://www.androidcompetencycenter.com/2009/02/android-basics-alarm-service/

    【讨论】:

      猜你喜欢
      • 2011-11-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多