目前我有一个从服务器接收的对象,它包含两个要绘制到画布的坐标,我现在可以在另一个带有硬编码坐标的类中进行。
我的问题是我无法弄清楚如何将对象(在一个线程内)发送到要绘制的第二个绘图类。
答案 0 :(得分:1)
Handler
是将消息和数据从通信工作者线程传输到UI线程的一种好方法。
如果您在问题中包含代码的基本大纲,那将更为理想。但是,我认为您基本上拥有的是自定义View
(您称之为“绘图类”),它构成了整体布局的一部分,该布局被设置为Activity
的内容视图。然后我假设你有一个通信工作者线程,它可能包含在同一个Activity
类中(或者可能在一个单独的Service
类中 - 但是现在我假设最简单的情况)。要让您的通信工作者线程更新View
,需要在UI线程上更新View
。因此,您将实例化将在UI线程(可能在Handler
)上运行的onCreate()
对象,该对象根据消息内容更新View
。然后,您的工作线程会向Handler
发送消息。
答案 1 :(得分:1)
对象永远不在线程中。你可以期待的最好的是只有一个线程引用该对象,并且需要不断警惕以保持这种方式。仅由一个线程访问的对象不需要任何接近思考和关心多个线程访问的对象。但是在一个线程上保留对象真的很难,而且在任何情况下你都不能这样做。
来自服务器的对象可以从任何类中的公共静态字段引用,因此可以在程序中的任何位置(以及任何线程)中使用。 是一种更优雅的方式,可以在需要时将其提供 - 正确封装 - 但这将作为后备解决方案。
然后你必须处理多线程访问。听起来你的对象可以变得不可变。这只是意味着一旦通过将其分配给它的引用字段使其“公开”,您就不会再次更改它(即使理论上可以这样做)。这使事情变得更简单,更快捷。创建您收到的对象,并在完全组装后将其放在其字段中。确保该字段已标记为volatile
,以便在其他地方立即看到任何更改。
现在你的绘图类只需要在需要时查看对象。 但是,在使用它之前,您希望将对象复制到本地变量。局部变量将在整个绘图过程中继续指向同一个对象。易失性字段可以在任何时刻改变,不断地引用新的或不同的对象。如果过时,使用局部变量,您的X和Y坐标将始终保持一致。 (在多线程系统中,一切都有点过时了。)如果使用了该字段,则可以从服务器发送的一个对象中获取X,从另一个发送Y。 (多线程真正的乐趣来自X * X
,其中X是一个整数,给出值35 - 来自两个不同对象的相同X.当if (aA != null) aA.doSomething()
抛出空指针异常时使用局部变量可以防止这一切。)
现在我想你可以避免同步和等待状态。您可能希望使您的坐标对象真正不可变(使用final
字段),以便其他程序员(甚至是您在完成其他工作6个月后)不会更改代码来动态修改对象。 (如果他们/你这样做,他/你将需要同步。)