2016-10-03 90 views
0

我觉得AsyncTaskLoader基本上是一个更好的AsyncTask,虽然我不完全确定我应该用AsyncTaskLoader替换AsyncTask实现。AsyncTaskLoader可以取代AsyncTask吗?

令我困惑的是Loader名称有点建议它应该用于加载数据。

如果我想写入数据(例如,以File为例)或执行任何其他后台操作(即不加载)怎么办?

是否Loader适合任何后台操作,我通常会使用AsyncTask作为?

+0

AsyncTaskLoader比AsyncTask更好吗? AsyncTaskLoader不提供像AsyncTask那样的进度更新,但是另一方面,您可以使用AsyncTaskLoader而不是AsyncTask并只返回一个空对象。但是,有什么意义? – Egg

+0

@Egg处理配置更改是使用'AsyncTask'的屁股疼痛,但'AsyncTaskLoader'使它很容易,这是我考虑它的主要原因。 – justanoob

+0

考虑对长时间运行的后台任务使用'IntentService',这些任务不会绑定到UI。 – Egor

回答

2

装载机用于加载数据,是的。它们填充的孔是在拨打LoaderManager#init()时可以在配置更改时“重新连接”它。这将做什么,

  1. 如果加载程序尚未启动,它将启动加载程序。
  2. 如果Loader已经启动但未完成,它会将回调连接到Loader并在加载时为回调提供数据。
  3. 如果Loader已经启动并完成,它将会而不是启动Loader并将加载的信息传递给回调函数。

所以这意味着如果用户把手机放在口袋里,它只是一直保持旋转一遍又一遍,就不会启动一百个加载任务来获取单个数据。

你不会真的在乎单一的出站任务,这是一个难以忘怀的任务。您可能也不希望发生这种情况,因为您可能希望执行所有文件写入操作,除非您每次都重新启动它们,否则装入器不会出现这种情况。在这种情况下,你打败了Loaders的目的。

+0

感谢您的回答。我正在考虑Loaders的主要原因是处理配置更改。 AsyncTask似乎很难实现它。 WeakReference可以帮助如果我不想回电给活动。使用无头碎片似乎是唯一的方法,但他们感觉像是过度杀伤。 – justanoob

+0

@justanoob:另一件需要注意的事情是,如果你重新启动它,Loaders将取消之前的Load。 AsyncTask不会这样做。带有LocalBroadcastReceiver的IntentService可能是将UI与后台任务解耦的更简单的方法。您发布的所有任务最终都会执行,而您的活动只需要收听BroadcastReceiver。 – DeeV

+0

IntentService + LocalBroadcastReceiver方法的问题也与配置更改有关。即使我在onCreate()/ onDestroy()中注册/取消注册接收者,在onDestroy()和onCreate()之后的方向更改期间,广播可能会出现,在这种情况下,我不会收到广播我测试过了)。 – justanoob

相关问题