我已经看过至少五种模式,您可以通过这些模式在工作线程中运行一些代码。最简单的:
new Thread(new Runnable() {
public void run() {
//
}
}).start();
我们可以延长AsyncTask
;我们有AsyncTaskLoader
和其他Loader
用于数据,Service
等等。
我认为其中每一个都有一些我在此不讨论的优点。我想知道的是:运行简单操作的最合适,最简洁的方法是什么?
定义简单:
AsyncTask
似乎不合适; Activity
或Fragment
; return
。我最初的想法是:
boolean myReturn;
new Thread(new Runnable() {
public void run() {
myReturn = myExtensiveTask();
}
}).start();
public boolean myExtensiveTask() { ... }
这是正确的(甚至是可能的)吗?该怎么做?
答案 0 :(得分:2)
使用bolts
实用程序框架(由Facebook和parse.com使用),它很简单:
Task.callInBackground(new Callable<MyReturnType>() {
@Override
public MyReturnType call() {
MyReturnType obj = doWork();
return obj;
}
});
答案 1 :(得分:0)
最佳解决方案可能涉及一些库代码。
我已经在我当前的项目中实现了一些允许我编写这样的方法的东西:
@QSchedule("0 * * * * ?")
public void runsEveryMinute()
{
System.out.println("It ran!");
}
我们现在使用这些。调度程序在QuartzScheduler之上工作。我相信spring只是通过导入Quartz支持来允许语法很多。
如果你很有创意,很多解决方案都可以这样工作。例如,如果您有一个构建菜单的类,那么您可以抽象所有菜单构建语法并使用注释驱动它。我也是这样做的。结构可能是这样的:
@MenuItem("File","Save")
public void fileSave() {
// This is executed when file save is selected
}
@MenuItem("File","Load")
public void fileLoad() {
// Executed when file load is seleclted
}
这些注释提供了构建整个菜单系统所需的所有信息,因此另一个类只需遍历带注释的类并为其构建菜单。在某处您可以看到如下代码:
Menu mainMenu = new MenuBuilder().buildMenu(MenuDefinition.class);
其中MenuDefinition.class包含如上所述的注释。这个解决方案最好的事情是什么? 100%可重复使用 - 只需将其放入任何项目中,您就不必再次手动构建菜单(或按钮,或其他任何困扰您的冗余任务)。
我并不是说这会直接解决您的问题,我所说的是您可能希望编写一些基础架构来简化您的未来调用。注释是一种非常酷的方式,用于指示您希望运行的代码,因为Java具有如此丑陋的匿名内部类语法。
哦,Java 8也应该让你想做的事情变得微不足道。在Groovy中(它的闭包很像Java 8)你可以使用非常接近的东西:
new Thread() {
println "this will run in another thread"
}
(我无法保证确切的语法,但它真的很接近)