有一些应用程序,根据用户的请求,从网络上下载一些数据并显示出来。此应用程序中的网络请求通过AsyncTask.
鉴于许多人断然建议在使用AsyncTaskInternet 时不要使用它(而是向服务发出网络请求),因此出现了这个问题。
再来一点:
该应用程序的本质是显示来自多个来源的(文本)新闻列表。
现在是如何实现的:
有一个Navigation Drawer显示站点列表的活动,通过单击某个菜单项,会出现一个包含 的片段RecyclerView,其中AsyncTask使用加载来自所选站点的数据。
当滚动RecyclerView到某个元素时,它会启动将信息AsyncTask加载RecyclerView到下一部分等等(一种Endless RecyclerView)。
当您选择另一个菜单项时,会出现另一个片段,但具有相同的操作原理(数据只是从另一个来源加载)。
创建每个片段时,它都会被执行setRetainInstance(true),也就是说,当设备配置更改时,来自它的数据AsyncTask将安全地返回到所需的片段。
从站点中提取必要信息的过程使用Jsoup.
问题:
这个应用程序的架构有什么问题?(就使用AsyncTask和一般而言)。
使用这个特定任务是好的做法AsyncTask吗?还是值得将网络工作转移到服务上?(我知道并非所有类型的服务都不能在主线程中工作)。
但是如果你还需要把网络搬到一个服务上,那么如果你需要加载数据,启动服务,加载数据,返回数据给片段,完成服务?所以每一次?
老实说,虽然它在每个角落都说AsyncTask它不好,但我看不出有任何明确的理由让网络成为这个特定应用程序的服务。但是既然很多人都说了,那我就有点不明白了。请给我解释一下。
事实上,AsyncTask它是为短期任务而设计的,但我加载了非常少量的数据(文本),最后AsyncTask它只需要几秒钟就可以完成。
据我了解,该服务的主要目的是执行长时间的后台任务。
我再重复一次——我并不是说在这种情况下最好的解决方案是使用AsyncTask,但我没有看到任何反对使用它的论据。
或者也许还有其他一些更正确的架构解决方案来完成这项任务?
尽管我阅读了 Internet(我阅读了很多),但对于描述类似内容的链接(也许我错过了),以及您对这个主题的回答和对这个问题的看法,我都会很高兴。
所以只说那些不知道如何烹饪它们的人。
AsyncTask如果你知道如何处理边缘情况,这是很正常的做法:屏幕旋转、上下文破坏等。AsyncTask不建议更大程度地使用它,因为已经有现成的常规库,如 Volley、Retrofit 等。服务用于繁重的任务或周期性任务。
对于在单独线程中加载异步数据的任务,使用继承的类
AsyncTaskLoader<D>代替Loader<D>. 该类AsyncTaskLoader<D>是抽象的,并且像 AsyncTask 一样工作。基于这个类,你可以实现一个抽象方法loadInBackground()。侦听器从加载器接收信息。为此,管理器注册一个侦听
OnLoadCompleteListener<D>事件的侦听器。下载完成后调用该方法onLoadFinished(Loader<D> loader, D result).为了使引导加载程序开始工作,必须启动它。正在运行的引导加载程序会监视数据,直到它重新启动或停止。
停止的加载程序继续监视数据更改,但不报告它们。如有必要,您可以重新启动或重新启动已停止的引导加载程序。
重新启动时,加载程序不应启动新的数据加载和监视更改。它的任务是释放不需要的数据。这种状态很少使用,但在某些情况下是需要的。
您的任务是创建自己的加载器,实现方法
loadInBackground(),并重写方法onStartLoading(),onStopLoading(),onReset(),onCanceled(),deliverResult(D results)。在这里阅读更多。
通常的整个麻烦
AsyncTask基本上是旋转屏幕。在屏幕旋转的情况下
AsyncTaskLoader,我们已经为您解决了。该课程非常适合您的任务,但总的来说,我只建议您在自己的设备上使用 2G \ 3G(慢速互联网),上传新数据并经常旋转屏幕,同时监控设备上的内存。如果即使互联网速度较慢也不会有泄漏和/或它会,但比方说,一个活动的大小 - 你可以保留你的选择。但是您需要记住 GoF 的一句重要的话——任何代码都会发生变化。
如果您打算继续改进应用程序的功能,那么无论如何您都会达到列表项将加载更多信息(照片、位置等)的程度。
因此,看看潜力,需要多少来维护它。