【发布时间】:2011-04-14 20:53:21
【问题描述】:
这是我在使用 Asyntask 时经常遇到的问题。联系 UI 线程的方法是调用 publishProgress() 并且此方法接受 只有一个 TYPE 参数的数组。
在后台运行的执行复杂计算的线程可能需要使用不同类型的对象在不同点更新 UI。
让我用一个例子来说明:
...do some processing...
// Send UI thread the integer values of the width & height of the image
...do some more processing...
// Send UI thread a String with custom message.
...do some more processing...
// Send UI thread an instance of MyObject so it can extract & display certain values
...do some cleanup job & finish...
但是,onProgressUpdate() 只接受一种类型的数组。
那么我是否将其设为一个无所不包的 Object 类型?由于可以从第 1、2 或 3 行调用此方法,所以我怎么知道如何向下转换它,那么现在是什么时候?
肯定有什么好方法可以做到这一点吗?
编辑:如果在 Android 中可能的话,我真的很想看到定义 publishProgress1(user-defined args1), publishProgress2(user-defined args2), publishProgress3(用户定义的args3) ...
【问题讨论】:
-
我相信您要求的构造类似于 VARIANT en.wikipedia.org/wiki/Variant_type
-
@JAL:感谢分享有趣的链接。 Variant_type 及其运行时类型确定让我想起了 Java 中的 Object 类型,它具有运行时向下转换。我真的很想看到,如果它在 Android 中是可能的,将是某种定义 publishProgress1(user-defined args1), publishProgress2(user-defined args2), publishProgress3(用户定义的args3) ...
-
@OceanBlue VisualBasisVARIANT 是一个旧的解决方案,但我宁愿看到一个更安全的解决方案,您可以使用消息和一个打开 message.what 的处理程序来解决启动三个顺序线程的问题。所以启动线程返回带有返回类型 A 的消息(0),处理程序中的陷阱消息,带有消息(1)返回类型 B 的启动线程,带有消息(2)的陷阱和启动线程等等。
-
@JAL:将任务分解为更小的任务/不同线程的问题是,如果您的工作需要串行完成,逻辑就会崩溃。除非......你进入整个线程锁定,等待/通知业务,我宁愿避免,潜在的死锁和东西。
-
@OceanBlue 我认为您可以使用我概述的消息按顺序执行此操作。仅当第一个线程返回时才启动下一个线程。如果数据不能通过消息传递,这可能不起作用。无需使用与共享内存并发完全不同的消息传递并发进行线程锁定、等待或通知。 en.wikipedia.org/wiki/Concurrent_computing