gpt4 book ai didi

java - android多线程中的正确设计

转载 作者:行者123 更新时间:2023-11-29 05:35:41 25 4
gpt4 key购买 nike

我在android上写了一个应用程序,其中通过主 Activity (UI线程)创建一个线程,新线程保存 Activity 实例,然后在运行时调用其中的方法。

我收到一个错误“无法在尚未调用 Looper.prepare() 的线程内创建处理程序”,并在这篇文章中发现: Can't create handler inside thread that has not called Looper.prepare()

在我不能直接调用另一个线程的方法的更多问题中,我应该使用 runOnUIThread 或 doInBackGround 等等...

我的问题是为什么?那个设计有什么问题?

提前致谢:)

最佳答案

你似乎有点困惑——这个问题没有多大意义,所以很难回答。

点点滴滴:

  1. 在 UI 线程中创建一个“保存 Activity 实例”的线程本身就是错误的:Activity 的生命周期很复杂,您不应该通过实例引用它。

  2. 你不能“调用另一个线程的方法”(除非你指的是 java.lang.Thread 对象本身,从上下文看来你不需要),因为对象不属于任何线程. Java 中的所有对象都存在于堆上,并且可以被任何线程访问。

  3. 但是由于每个线程都是一个对象,您可以拥有一个 Map,其中包含由线程实例索引的对象。 ThreadLocal 基本上就是这样。

  4. Android 引入了“Loopers”的概念——您可以在任何线程中构建一个并调用它;如果这样做,您可以说线程“有一个循环器”。一个有循环器的线程被困在一个循环中,执行处理程序传递给它的任何工作,并且 - 在完成每个任务之后 - 等待另一个任务的到来。这是主线程一直在做的事情。如果您构建一个处理程序实例,则可以从任何线程调用该处理程序,但会连接到调用构造函数的线程的循环程序。

  5. 由于处理程序通过将工作传递给循环器来工作,因此只能在具有循环器的线程中构建它们。

我不确定你想要实现什么,但底线是:

  • 您持有对 Activity 的引用的想法是错误的 - 随它去吧(并使用 Loader API 或服务)
  • 你尝试在一些没有 Lopper 的自定义线程上构建一个 Handler 实例(可能添加循环器不是你想要的,而是你想在你的主线程中构建 Handler)
  • 您将对象想象为线程拥有 - 尝试摆脱这种想法,它会扭曲您的思维方式。

关于java - android多线程中的正确设计,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19599103/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com