天天看点

AndroidAnnotations学习笔记--线程(五)

[size=large][color=red][b]@Background[/b][/color][/size]

这个注解表明,这个方法将运行现UI线程以外的线程中

这个方法是在单独的线程上执行,但这并不一定意味着开启一个新的线程,因为会使用共享缓存线程池执行器,防止创建太多的线程。

如果你想取消后台任务,你可以使用ID字段进行取消。每个任务你都可以用[i]BackgroundExecutor.cancelAll("id");[/i]进行取消。

在默认情况下,@Background是并行处理的。如果你想顺序的执行,您可以使用“serial”字段。所有的后台任务,如果具有相同的[i]serial[/i],将被按顺序执行。

如果你需要Background方法延迟一定时间运行,您可以使用[i]delay[/i]参数:

[color=red][list]

[*]如果在delay开始前,取消线程,线程不会执行

[*]如果启动多个线程,线程名子一样的话,取消线程的话,所有相同名字的线程都会取消

[*]如果串行执行时取消线程,后续的线程不会执行。

[/list][/color]

[size=large][color=red][b]@UiThread[/b][/color][/size]

@UIThread 表明该方法将运行在UI线程上

代码示例

如果你需要该方法延迟一定时间运行,您可以使用[i]delay[/i]参数:

如果你要优化UI Thread的调用,你需要设置[i]propagation = Propagation.REUSE[/i]这个参数。

[size=large][color=red][b]@SupposeBackground、@SupposeUiThread[/b][/color][/size]

这两个注解可以保证方法是在正确的线程中调用

[list]

[*]@SupposeBackground 这个注解确保从后台线程调用,如果不是在后台进行调用会引发 IllegalStateException

[*]@SupposeUiThread 这个注解确保从UI线程调用。如果不是,那么就会抛出IllegalStateException。

[/list]

示例代码