我知道这里有很多与此主题相关的主题,但是我还没有真正回答我的问题,其中很多主题来自2010年,当时似乎并不太重视保留任务离开UI线程。
我需要进行足够密集的数据库查询,以致导致UI响应明显延迟(在我的S5上,因此在很多手机上情况会更糟)。我想将查询推送到另一个线程。我一直在使用ASyncTask进行此操作,但我正在阅读ASyncTask的问题以及诸如屏幕旋转,中断应用程序和内存泄漏之类的问题。我到处都看到的建议是使用CursorLoader,但为此构造函数需要一个Uri,因为它是为内容提供者设计的。内容提供者不仅对我的应用似乎有点矫,过正,而且Google的内容提供者教程页面特别指出:“如果使用完全在您自己的应用程序中,则不需要提供者来使用SQLite数据库。”
所以我的问题是,ASyncTask和内容提供者之间有什么关系?内部数据库是否有CursorLoader的实现?也许是ASyncTask的更强大的实现?
我一直在使用ASyncTask进行此操作,但我正在阅读ASyncTask的问题以及诸如屏幕旋转,中断应用程序和内存泄漏之类的问题。
AsyncTask
正确使用有点棘手。由一个保留的片段(例如,模型片段)来管理一个会有所帮助。
内部数据库是否有CursorLoader的实现?
没有一个很好的工作。我说这是写了一个(并且自弃用以来)。该Loader
接口的设计是围绕一个单一的用例的抽象:ContentProvider
。
也许是ASyncTask的更强大的实现?
并不是AsyncTask
需要“更强大”,而是您必须意识到它的各种问题。例如,自负的CursorLoader
使用AsyncTask
。
归根结底,所有AsyncTask
工作都是使用线程池中的后台线程,并将通信调解回主应用程序线程以获取工作结果。有多种方法可以达到相同的目的。目前,我很喜欢将greenrobot的EventBus(或者,如果可能有很多同时发生的事件,则从线程池中使用)与普通线程一起使用。除此之外,您还可以:
Handler
post()
上View
runOnUiThread()
上Activity
所有这些都假定工作相当短暂且可以随意处理,就像您的情况一样。对于较长和/或较少使用的工作,如果工作可能需要数十秒或更长时间,请使用IntentService
,可能是myWakefulIntentService
。
但是,所有这些仍然存在问题,在某些情况下,它们AsyncTask
本身也存在相同的问题(例如,正确解决配置更改)。没有“银弹”。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句