【问题标题】:Android Use of AsyncTaskLoader in a ServiceAndroid 在服务中使用 AsyncTaskLoader
【发布时间】:2013-01-26 23:44:08
【问题描述】:

我需要做出设计决定。
根据我在 android 开发者网站上阅读的内容,我想我想实现一个服务,它启动一个 AsyncTaskLoader 以在后台从操作系统进程加载数据。
在 android 开发者站点文档中,它说 AsyncTaskLoader 可以在活动和片段中使用,但没有提到服务。

在服务中使用 AsyncTaskLoader 是一种不好的做法吗?
如果是这样,我如何在后台从正在运行的操作系统进程中收集数据? (注意:即使应用程序关闭/销毁,我也需要继续收集)

【问题讨论】:

    标签: android service asynctaskloader


    【解决方案1】:

    Loader一般用于创建和销毁比较频繁的UI元素,需要访问之前查询的对象,而不需要每次都重新查询。 Service 不会像 Activity 或 Fragment 那样在加载中被销毁,因此产生一个新线程被认为是在 Service 后台加载数据的最佳实践。

    【讨论】:

    • 你碰巧有一些例子的链接吗?
    • IntentService 将保留一个 Intent 队列进行处理,并在后台线程中运行 onHandleIntent。这是关于 IntentServices 的一个很好的教程mobile.tutsplus.com/tutorials/android/…
    • 查看我对 kabuko 关于 IntentSevice 的回复
    【解决方案2】:

    Loaders 真的是for Activities and Fragments,如果你只是想在后台线程中做一些工作的好方法,考虑IntentService 可能是有意义的。 AsyncTaskLoader 中是否有一些看起来很有用的特定内容?

    如果您的应用被销毁,您将无法继续收集。如果您的应用程序被销毁,它就无法进行任何工作。不过,Service 绝对是您想要在后台工作的对象。

    【讨论】:

    • 是的,我写道 AsyncTaskLoader 将从服务启动。 AsyncTaskLoader 没有什么特别之处,文档说加载器是用来收集数据的。顺便说一句,服务不在单独的线程中运行,它们在 UI 线程中运行。
    • @ilomambo 默认情况下是的,但这就是为什么我提到IntentService...
    • 它在文档中说“在 IntentService 上运行的操作不能被中断”以及“如果在 IntentService 中运行的操作,并且您向它发送另一个请求,则请求将等待直到第一次手术结束。”。我实际上可能需要停止后台工作,这是一个一直在生成输出的操作系统进程;目前尚不清楚我是否可以使用 IntentService。
    • 可以在Service中创建一个HandlerThread。这不会在 UI 线程上运行。这是进行后台活动的推荐方法。请参阅developer.android.com/guide/components/services.html 中的“扩展服务类”。 IntentService 类是通用的,更容易实现工作队列,但如果你想做多线程,请查看链接。
    • 经过一番思考,在我看来,也许我可以调整 IntentService 并通过使用 onStartCommand() 作为消息处理程序而不是对所有意图请求进行排队来完成后台工作。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-11-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多