2009-09-29 62 views
2

这里的情景:Android的异步服务调用策略

  1. 客户端进行远程调用服务(返回void),并提供 一个回调对象
  2. 服务执行在后台线程需要长时间运行的逻辑 然后使用回调对象来触发醚成败 ,其(因为这些操作的可视元素)在 活动#执行runOnUiThread方框

该场景运行良好。问题是 - 我可以使用AsyncTask来使 代码变得更简洁(如何?),并且以这种方式执行 会有什么好处吗?

或者我应该从产品总数客户端回调脱身, 执行改装到内 的AsyncTask#doInBackground返回一些值远程服务电话?

回答

3

很难说AsyncTask是否会减少冗余,因为我们不知道当前实现的详细程度。

对我来说,AsyncTask意味着我不必担心自己清理线程(例如,发布某种杀手作业到LinkedBlockingQueue我的后台线程正在等待)。它还消除了我用于创建LinkedBlockingQueues的定制Job类。并且,它简化了一些在UI线程上做最后的工作。

就你而言,对于远程服务,UI线程问题不太重要,因为活动需要处理它自己。

我没有看到#2和最后一段的区别。在这两种情况下,您的服务都会调用回调对象,该对象将使用类似runOnUiThread()的东西来安排UI线程上的工作。 AFAIK,唯一的两种方法可以让服务进行任何类型的异步工作,让客户知道工作是通过广播Intent或回调对象完成的。广播Intents很方便,但公开(即其他代码可以监视它们)。

我怀疑我在这里可能没有太多帮助,但我只是不知道自己的场景足以提供更多细节。

+0

的场景是不是很原始。我有一个服务从远程位置查询一些XML。当活动通过提供URL来请求XML时,它会立即获得缓存副本或进入等待模式并等待服务完成/失败。 当我注意到您在EndlessAdapter中使用AsyncTask时,我很高兴地用回调,基本线程和runOnUiThread编码。如果我错过了一些简单的做我正在做的事的方法,这让我很好奇。 顺便说一句 - 感谢您的回答,它像往常一样好! – Bostone

0

我有一个非常相同的问题:我正在开发一个地图活动,具有'延迟加载'功能(来自网络的xml,解析它,然后用从解析中创建的'items'更新我的地图...)

我不知道什么是“最好”的方式来实现它......从一个线程,通过意向更新通知推出

  • 异步服务?
  • 只是一个线程(没有服务,因为我并不需要暴露在其他应用程序)W /回调
  • 的AsyncTask有回调 我在速度方面comparingthese,使用Android SDK性能分析工具traceview

我想更精确的答案可能来自于Android的developper组的Android贡献者可以找到...

+0

我认为Mark最近总是建议使用AlertManager来执行预定更新而不是服务。 – Bostone