【问题标题】:Multiple threads in Android activity/serviceAndroid活动/服务中的多个线程
【发布时间】:2010-10-14 15:42:18
【问题描述】:

我有一个 android 应用程序,在列表中每个元素的列表视图中,我在单独的线程中从 web 加载图像。因此,如果列表视图中显示了 8 个项目,则活动将尝试触发 8 个不同的线程,每个列表项一个用于加载图像。当您向下滚动列表时,如果之前的线程尚未完成执行,线程数可能会增加。

我很想知道单个 android 应用程序可以并行执行多少个并发线程?有限制吗?我不希望这些线程在缓慢的互联网连接上导致 ANR,因为它们是独立的?但似乎 ANR 确实发生了,可能是因为应用程序/设备的资源不足,因此在 UI 中生成一个新活动需要超过 5 秒,这会导致 ANR?

任何关于如何在缓慢的互联网连接上提高响应能力的线索将不胜感激。

【问题讨论】:

    标签: android multithreading service android-activity


    【解决方案1】:

    后来我发现我的应用程序挂起并且运行缓慢并不是因为它产生了太多线程。但这是因为我使用的是服务而不是 IntentService。我的网络 IO 发生在 Service 的主线程上。这意味着阻塞 IO 会阻塞主线程,并且手机/应用程序将趋于死机并弹出 ANR。

    后来我改变了我的设计,在我的服务中的衍生线程中运行网络 IO 操作,这让应用程序恢复了活力。一切都如预期的那样顺利。

    因此,每当您的服务导致 ANR 时,请确保如果您没有使用 IntentService(它们在单独的线程中触发作业),那么您会在新线程中触发阻塞操作。

    希望对某人有所帮助。

    【讨论】:

      【解决方案2】:

      处理此问题的一种方法是使用thread pool。我不知道并发线程的数量是否有限,但是创建和销毁它们是昂贵的。使用线程池,您可以执行任务的线程数量有限。

      线程在完成任务后可以重复使用,从而提高性能。

      如果需要同时完成的工作多于执行它的线程数,则需要将工作排队,直到有线程空闲。

      【讨论】:

      • 因此,如果我使用异步任务在列表视图中加载图像,而不是生成一个新线程,那么对于每个列表项,它是否使用相同的 AsyncTask 并因此使用相同的线程池,还是会使用不同的异步任务,因此不同的线程池?
      • @Priyank 我相信 CommonsWare 的意思是 AsyncTask 使用线程池作为其实现的一部分。因此,当您创建 AsyncTask 时,它可能会重用旧线程而不是创建新线程。这有助于减少对象创建,从而减少对 gc 等的需求。如果您真的想同时下载 100 个图像,每个图像都在不同的线程上,它就没有那么有用了。但是,如果您下载 5 个,几秒钟后再下载 5 个,您可能会看到性能提升。
      • 哦,好吧!这就说得通了。谢谢你解释。
      猜你喜欢
      • 2017-05-27
      • 2016-04-17
      • 2016-05-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-28
      • 1970-01-01
      相关资源
      最近更新 更多