我觉得AsyncTaskLoader
基本上是一个更好的AsyncTask
,虽然我不完全确定我应该用AsyncTaskLoader
替换AsyncTask
实现。AsyncTaskLoader可以取代AsyncTask吗?
令我困惑的是Loader
名称有点建议它应该用于加载数据。
如果我想写入数据(例如,以File
为例)或执行任何其他后台操作(即不加载)怎么办?
是否Loader
适合任何后台操作,我通常会使用AsyncTask
作为?
我觉得AsyncTaskLoader
基本上是一个更好的AsyncTask
,虽然我不完全确定我应该用AsyncTaskLoader
替换AsyncTask
实现。AsyncTaskLoader可以取代AsyncTask吗?
令我困惑的是Loader
名称有点建议它应该用于加载数据。
如果我想写入数据(例如,以File
为例)或执行任何其他后台操作(即不加载)怎么办?
是否Loader
适合任何后台操作,我通常会使用AsyncTask
作为?
装载机用于加载数据,是的。它们填充的孔是在拨打LoaderManager#init()
时可以在配置更改时“重新连接”它。这将做什么,
所以这意味着如果用户把手机放在口袋里,它只是一直保持旋转一遍又一遍,就不会启动一百个加载任务来获取单个数据。
你不会真的在乎单一的出站任务,这是一个难以忘怀的任务。您可能也不希望发生这种情况,因为您可能希望执行所有文件写入操作,除非您每次都重新启动它们,否则装入器不会出现这种情况。在这种情况下,你打败了Loaders的目的。
感谢您的回答。我正在考虑Loaders的主要原因是处理配置更改。 AsyncTask似乎很难实现它。 WeakReference可以帮助如果我不想回电给活动。使用无头碎片似乎是唯一的方法,但他们感觉像是过度杀伤。 – justanoob
@justanoob:另一件需要注意的事情是,如果你重新启动它,Loaders将取消之前的Load。 AsyncTask不会这样做。带有LocalBroadcastReceiver的IntentService可能是将UI与后台任务解耦的更简单的方法。您发布的所有任务最终都会执行,而您的活动只需要收听BroadcastReceiver。 – DeeV
IntentService + LocalBroadcastReceiver方法的问题也与配置更改有关。即使我在onCreate()/ onDestroy()中注册/取消注册接收者,在onDestroy()和onCreate()之后的方向更改期间,广播可能会出现,在这种情况下,我不会收到广播我测试过了)。 – justanoob
AsyncTaskLoader比AsyncTask更好吗? AsyncTaskLoader不提供像AsyncTask那样的进度更新,但是另一方面,您可以使用AsyncTaskLoader而不是AsyncTask并只返回一个空对象。但是,有什么意义? – Egg
@Egg处理配置更改是使用'AsyncTask'的屁股疼痛,但'AsyncTaskLoader'使它很容易,这是我考虑它的主要原因。 – justanoob
考虑对长时间运行的后台任务使用'IntentService',这些任务不会绑定到UI。 – Egor