【发布时间】:2016-10-30 12:06:41
【问题描述】:
我正在制作一个 android 库。在我的库中我希望允许用户在后台或主线程中执行特定任务。
我想做这样的事情。
第一个场景
MyLibabry.with(context)
.performSomeTask(<params>)
.execute();
当用户编写上面的 sn-p 代码时。该任务应在后台执行。所以我将使用任何监听器返回任务的结果。
现在考虑下面的 sn-p 代码。
第二个场景
Result result = MyLibabry.with(context)
.performSomeTask(<params>)
.get();
现在,当用户在语句末尾附加 get() 时。该任务应该在主线程上执行并阻塞其他线程。这就是 result 立即初始化的原因。
所以我的问题是我如何实现如果用户附加 .get() 的功能,performSomeTask() 中的线程应该在主线程上运行。否则在后台。
注意:不要专注于返回结果。我将在 Java 泛型中实现它。 我想知道的是如何使代码可重用,以便当用户只附加.get() 时,它将在主线程上运行。否则,相同的代码应该在后台运行。我不想写重复的代码。
您可以参考现有的库。
所以两个库具有相同的功能,还有更多的库具有相同的功能,我也想做同样的。
如果有人为此提供一个小例子,那就太好了。
【问题讨论】:
-
让我们把它分解成一个Runnable:你可以调用
run,它就会在当前线程上运行。或者您可以设置一个线程new Thread(myRunnable).start()让它在不同的线程中运行,或者您可以将它提交给某个 Executor ... 所以在您的情况下调用get()可能会映射到直接运行 run 方法和execute将其发布到一些 HanlderThread 或 Executor 或类似... -
添加了一个答案,该答案为 Fildor 的 Runnable 示例提供了更多信息,并显示了基本的 Executor 代码,它是 Java 和 Android 最佳实践,适用于您尝试执行的那种并发包装。
标签: java android multithreading android-library