RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 589669
Accepted
Burence
Burence
Asked:2020-11-11 09:34:21 +0000 UTC2020-11-11 09:34:21 +0000 UTC 2020-11-11 09:34:21 +0000 UTC

AsyncTask vs IntentService vs 做网络时的其他东西

  • 772

有一些应用程序,根据用户的请求,从网络上下载一些数据并显示出来。此应用程序中的网络请求通过AsyncTask.

鉴于许多人断然建议在使用AsyncTaskInternet 时不要使用它(而是向服务发出网络请求),因此出现了这个问题。

再来一点:

该应用程序的本质是显示来自多个来源的(文本)新闻列表。

现在是如何实现的:

有一个Navigation Drawer显示站点列表的活动,通过单击某个菜单项,会出现一个包含 的片段RecyclerView,其中AsyncTask使用加载来自所选站点的数据。

当滚动RecyclerView到某个元素时,它会启动将信息AsyncTask加载RecyclerView到下一部分等等(一种Endless RecyclerView)。

当您选择另一个菜单项时,会出现另一个片段,但具有相同的操作原理(数据只是从另一个来源加载)。

创建每个片段时,它都会被执行setRetainInstance(true),也就是说,当设备配置更改时,来自它的数据AsyncTask将安全地返回到所需的片段。

从站点中提取必要信息的过程使用Jsoup.

问题:

这个应用程序的架构有什么问题?(就使用AsyncTask和一般而言)。

使用这个特定任务是好的做法AsyncTask吗?还是值得将网络工作转移到服务上?(我知道并非所有类型的服务都不能在主线程中工作)。

但是如果你还需要把网络搬到一个服务上,那么如果你需要加载数据,启动服务,加载数据,返回数据给片段,完成服务?所以每一次?

老实说,虽然它在每个角落都说AsyncTask它不好,但我看不出有任何明确的理由让网络成为这个特定应用程序的服务。但是既然很多人都说了,那我就有点不明白了。请给我解释一下。

事实上,AsyncTask它是为短期任务而设计的,但我加载了非常少量的数据(文本),最后AsyncTask它只需要几秒钟就可以完成。

据我了解,该服务的主要目的是执行长时间的后台任务。

我再重复一次——我并不是说在这种情况下最好的解决方案是使用AsyncTask,但我没有看到任何反对使用它的论据。

或者也许还有其他一些更正确的架构解决方案来完成这项任务?

尽管我阅读了 Internet(我阅读了很多),但对于描述类似内容的链接(也许我错过了),以及您对这个主题的回答和对这个问题的看法,我都会很高兴。

java
  • 2 2 个回答
  • 10 Views

2 个回答

  • Voted
  1. Best Answer
    Suvitruf - Andrei Apanasik
    2020-11-11T12:31:39Z2020-11-11T12:31:39Z

    老实说,即使它在每个角落都说 AsyncTask 不好

    所以只说那些不知道如何烹饪它们的人。AsyncTask如果你知道如何处理边缘情况,这是很正常的做法:屏幕旋转、上下文破坏等。

    AsyncTask不建议更大程度地使用它,因为已经有现成的常规库,如 Volley、Retrofit 等。

    服务用于繁重的任务或周期性任务。

    • 2
  2. Silento
    2020-11-11T12:31:57Z2020-11-11T12:31:57Z

    对于在单独线程中加载异步数据的任务,使用继承的类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 的一句重要的话——任何代码都会发生变化。

    如果您打算继续改进应用程序的功能,那么无论如何您都会达到列表项将加载更多信息(照片、位置等)的程度。

    因此,看看潜力,需要多少来维护它。

    • 1

相关问题

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    如何停止编写糟糕的代码?

    • 3 个回答
  • Marko Smith

    onCreateView 方法重构

    • 1 个回答
  • Marko Smith

    通用还是非通用

    • 2 个回答
  • Marko Smith

    如何访问 jQuery 中的列

    • 1 个回答
  • Marko Smith

    *.tga 文件的组重命名(3620 个)

    • 1 个回答
  • Marko Smith

    内存分配列表C#

    • 1 个回答
  • Marko Smith

    常规赛适度贪婪

    • 1 个回答
  • Marko Smith

    如何制作自己的自动完成/自动更正?

    • 1 个回答
  • Marko Smith

    选择斐波那契数列

    • 2 个回答
  • Marko Smith

    所有 API 版本中的通用权限代码

    • 2 个回答
  • Martin Hope
    jfs *(星号)和 ** 双星号在 Python 中是什么意思? 2020-11-23 05:07:40 +0000 UTC
  • Martin Hope
    hwak 哪个孩子调用了父母的静态方法?还是不可能完成的任务? 2020-11-18 16:30:55 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    user207618 Codegolf——组合选择算法的实现 2020-10-23 18:46:29 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    Arch ArrayList 与 LinkedList 的区别? 2020-09-20 02:42:49 +0000 UTC
  • Martin Hope
    iluxa1810 哪个更正确使用:if () 或 try-catch? 2020-08-23 18:56:13 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5