最简洁的方式来运行简单的后台任务?

时间:2015-04-29 16:59:12

标签: android android-asynctask android-service android-handler

我已经看过至少五种模式,您可以通过这些模式在工作线程中运行一些代码。最简单的:

new Thread(new Runnable() {
    public void run() {
      //
    }
}).start();

我们可以延长AsyncTask;我们有AsyncTaskLoader和其他Loader用于数据,Service等等。

我认为其中每一个都有一些我在此不讨论的优点。我想知道的是:运行简单操作的最合适,最简洁的方法是什么?

定义简单

  • 相当短的行动,< 1s;
  • 无需处理UI元素;
  • 一行命令或类似命令,因此使用新类扩展AsyncTask似乎不合适;
  • 无需在ActivityFragment;
  • 中通知任务是否成功
  • 无需显示进度;
  • 只需要某种return

我最初的想法是:

boolean myReturn;

new Thread(new Runnable() {
    public void run() {
      myReturn = myExtensiveTask();
    }
}).start();

public boolean myExtensiveTask() { ... }

这是正确的(甚至是可能的)吗?该怎么做?

2 个答案:

答案 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"
}

(我无法保证确切的语法,但它真的很接近)