2013-10-25 38 views
1

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

我得到了一个错误,在这个岗位找到了“内螺纹已不叫Looper.prepare()无法创建处理程序”: Can't create handler inside thread that has not called Looper.prepare()

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

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

在此先感谢:)

+1

许多Android框架的类(尤其是UI工具箱中的类)不是线程安全的,因此在非UI线程上访问它们可能会导致不可预知的代码行为。我的猜测是,您正在调用最终(可能通过其后续调用)接触UI元素或尝试创建“Handler”的活动方法。你能更详细地解释你想做什么吗?也许发布一些代码? – acj

回答

3

你似乎有点糊涂 - 问题没有多大意义,所以这是相当难回答的问题。

星星点点:

  1. 在创建UI线程的线程“节约活动实例”是错误的本身:活动的生命周期是复杂的,你不应该通过实例参考。因为对象不属于任何线程,所以你不能“调用另一个线程的方法”(除非你的意思是java.lang.Thread对象本身,并且从上下文看来你不这样做)。 Java中的所有对象都生活在堆上,可以被任何线程访问。

  2. 但是由于每个线程都是一个对象,因此可以拥有一个包含线程实例索引的对象的Map。这基本上是ThreadLocal的内容。

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

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

我不知道你想达到什么,但底线是:

  • 你持有到活动的参考想法是错误的 - 只是让他走了(并用装载机API或服务)
  • 您尝试在不具有高枝剪(可能添加弯一些自定义的线程建立一个处理程序实例是不是你想要的,而不是你想建立的处理程序在你的主线程)
  • 你想象的对象作为线程所有者 - 试图摆脱这个想法,它不一致你的想法。