对同步适配器、服务、加载程序、提供程序和异步任务感到困惑? [关闭]
Posted
技术标签:
【中文标题】对同步适配器、服务、加载程序、提供程序和异步任务感到困惑? [关闭]【英文标题】:confused between syncAdapter,services,loaders,providers and asynctask? [closed] 【发布时间】:2016-01-10 06:54:48 【问题描述】:我是 android 新手,正在阅读文档和一些教程。
服务
开发者指南说应该使用它,当需要在后台运行长时间运行的任务时,比如音乐播放器。
异步任务
创建一个工作线程来执行后台任务,例如使用 api
获取数据,然后通知 UI 线程它的 onPostExecute()
回调方法。
加载器
在单独的线程上执行操作,注册到侦听器并通知数据集更改。
提供者
通过在清单文件中公开数据,在不同应用之间共享数据。
同步适配器
用于在安卓设备和网络服务器之间同步数据。
理论上,我理解上述概念,就像它们的用途一样。 我很难把它们整理好,比如什么时候用什么?其中最好用的是什么?在什么场景下应该使用什么?
对于缓存,我使用了sqlite
或 volley 和 retrospice
正如我所说,我是 android 初学者并尝试理解这些概念。
任何帮助和建议将不胜感激。 提前谢谢。
【问题讨论】:
你的问题太宽泛了。请通过指定您要实现的实际用例来缩小范围。 感谢@StephanBranczyk 的回复。我只是想清楚地知道,在什么情况下,什么是最好的使用方法。假设一个显示天气预报的应用程序,我也可以使用 aynctask 来访问天气 api 或服务。出于缓存目的,我可以使用 sqlite 或 volley 之类的库。以及用于查询和所有其他目的的内容提供者。用于 aysnc 加载数据并监听数据源更改它绑定到的加载器。我只是好奇,如何将所有这些东西封装成一个更好的解决方案。对不起,我只是对此感到困惑。 这里的信息图表可以帮助您更好地理解 :) 第三个选项是服务:raw.githubusercontent.com/stephanenicolas/robospice/master/gfx/… 谢谢@Kalem。我正在调查。 【参考方案1】:回答很快:
AsyncTask :可能会阻塞 UI 线程的短任务。您不介意它们是否被取消并且您必须重新启动它们。
服务:当你有很长的任务不想被应用程序更改打断时使用。比 AsyncTask 更难实现。
加载器:专为数据库访问而设计
SyncAdapter:这里没有实时数据。您可以在特定时刻安排数据同步(即同步邮件、联系人数据等)。假设您每小时都有新数据。
Providers:与上述无关。这用于在应用程序之间共享数据。您不关心共享应用程序如何检索数据,您只知道您可以请求给定的资源。
这个信息图帮助我更好地理解了前 3 个:https://raw.githubusercontent.com/stephanenicolas/robospice/master/gfx/RoboSpice-InfoGraphics.png
【讨论】:
感谢@kalem,感谢您的快速回答。它清除了大部分相关概念。特别是您分享的信息图。但我还是希望能得到详细的答复。【参考方案2】:为 Kaleb 的回答补充几点:
内容提供者:
Android 实际上有很多方法可以共享数据。 ContentProvider 是一种在应用程序之间共享数据库的方法。假设您的手机上有 3 个电子邮件客户端,它们可以缓存来自云端的数据,以防您离线。您只维护一个电子邮件的离线数据库是有道理的。如果您有地址簿、短信数据库或推文数据库,情况也是如此。如果您想更新所有这些数据,也是如此。您真的只想从云中更新该数据一次,而不是每次更新三次,这将我带到下一个主题 SyncAdapter。
同步适配器:
SyncManager 足够智能,可以一次性完成所有同步请求,从而最大限度地减少天线通电时间,从而节省电池使用量。此外,在 AccountManager 的帮助下,手机用户可以自己覆盖同步首选项,但前提是开发人员首先选择使用 SyncAdapter。
此外,SyncAdapter 只能与 ContentProvider 一起使用。因此,即使您不想与其他应用共享数据,如果您想使用 SyncAdapter,也必须使用内容提供程序。
话虽如此,对于初学者(甚至是中级开发人员)来说,ContentProvider 很难实现。我建议你暂时远离他们。你应该使用一个 ContentProvider,如果你想要做的已经有一个,但我不建议你尝试创建你自己的。
加载器:
装载机很好。如果您想显示来自本地数据库(或来自 ContentProvider)的数据,请学习使用它们。他们会节省你的时间。与 SyncAdapter 不同,加载程序不需要 ContentProvider 即可工作。他们可以直接访问 SQLite。
服务:
学习使用它们。关于他们有太多话要说。重要的一点是,您应该使用诸如 AlarmManager 或 BroadcastReceivers 之类的组件来最小化它们的存活时间。此外,您还需要了解 Service 和 IntentService 之间的区别。
异步任务:
AsyncTask 在 Android 中经常是必要的,以避免阻塞主 UI 线程。不要认为因为您使用的是 AsyncTask,就可以放弃使用服务。
请注意,许多 Android 教程只为您提供了演示概念的最少代码量,因此它们通常会跳过正确的线程。请注意,如果需要,您可以手动启动自己的线程,但 AsyncTask 会为您执行其他操作,使其成为 UI 线程被阻塞并且您收到“应用程序无响应”错误的许多情况的理想选择。
库:
那里有很多好的图书馆。我不会说哪些是好的。学习使用每个人都推荐的那些。这些库可以为你做很多事情(假设你足够好让它们工作)。有一点学习曲线,但这是值得的。他们在更高的抽象级别上处理 Android,因此通常情况下,线程和许多其他事情通常会为您处理好。
还有很多其他的事情我在掩饰,或者我根本没有提到,但就像我说的,我认为你的问题太宽泛了。如果你真的想要更多细节,你应该蹲下来阅读一些开发者指南并观看谷歌提供的一些 youtube 视频。
【讨论】:
谢谢@Stephan,我将进一步探索我的学习曲线。它确实清除了许多基本概念。 SyncAdapter 不需要 ContentProvider。您创建一个存根帐户和 ContentProvider 并将其与另一个持久性方案一起使用。 developer.android.com/training/sync-adapters/… 同时避免使用AsyncTask:blog.danlew.net/2014/06/21/the-hidden-pitfalls-of-asynctask以上是关于对同步适配器、服务、加载程序、提供程序和异步任务感到困惑? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章