ThreadUtils:
提供了对Android的handler一系列封装简化操作,项目必备。
<1>该类内部会维护一个UIhandler<new Handler(Looper.getMainLooper())>, 出于lazyInit的目的,该handler作为某个
内部static类的private static成员并在该class被load的时候才会真正的初始化为UIhandler。外部的ThreadUtils类可以直接
通过该static类来引用此UIhandler,不要惊奇,java中,此内部类的private成员可以被其所在外部类直接引用
<并且也可以被同属于一个外部类的其他内部类直接使用>。
<2>判断是否run在UI thread<不严谨,对于Service这种来说,是没有UI thread的,只有main thread>,
Looper.getMainLooper() == Looper.myLooper()。
<3>一个mainThreadEnforcer/Checker, 在发现当前的thread不是mainthread时,会throw一个IllegalStateException,
同样相对的还有一个noMainThreadEnforcer/Checker。
还有一个只在debug下才会进行check mainThread的Checker.
<4>有了UIThreadHandler,就可以直接将post 一个 runnable到main thread这种操作进行封装了,还包括对postDelayed的封装。
<5>runOnUiThread()有两种case: 已经在UI thread,直接Runnable.run(), 不在UI thread,那么post到UI thread。
一个是同步返回,一个是异步返回,这要求调用者对这个很清楚。
还有对FutureTask<T>/Callable<T>的相同实现, Callable会被封装到一个FutureTask
<6>runOnUiThreadBlocking,为了实现blocking,必须借助于FutureTask,在将task post到UI thread以后<当然也有可能本身就在main
thread,直接run就可以了>,调用task.get()来进行等待,注意get()会抛出InterruptedException/ExecutionException,
需要将这些Exception再封装为RuntimeException throw出去。
提供了对Android的handler一系列封装简化操作,项目必备。
<1>该类内部会维护一个UIhandler<new Handler(Looper.getMainLooper())>, 出于lazyInit的目的,该handler作为某个
内部static类的private static成员并在该class被load的时候才会真正的初始化为UIhandler。外部的ThreadUtils类可以直接
通过该static类来引用此UIhandler,不要惊奇,java中,此内部类的private成员可以被其所在外部类直接引用
<并且也可以被同属于一个外部类的其他内部类直接使用>。
<2>判断是否run在UI thread<不严谨,对于Service这种来说,是没有UI thread的,只有main thread>,
Looper.getMainLooper() == Looper.myLooper()。
<3>一个mainThreadEnforcer/Checker, 在发现当前的thread不是mainthread时,会throw一个IllegalStateException,
同样相对的还有一个noMainThreadEnforcer/Checker。
还有一个只在debug下才会进行check mainThread的Checker.
<4>有了UIThreadHandler,就可以直接将post 一个 runnable到main thread这种操作进行封装了,还包括对postDelayed的封装。
<5>runOnUiThread()有两种case: 已经在UI thread,直接Runnable.run(), 不在UI thread,那么post到UI thread。
一个是同步返回,一个是异步返回,这要求调用者对这个很清楚。
还有对FutureTask<T>/Callable<T>的相同实现, Callable会被封装到一个FutureTask
<6>runOnUiThreadBlocking,为了实现blocking,必须借助于FutureTask,在将task post到UI thread以后<当然也有可能本身就在main
thread,直接run就可以了>,调用task.get()来进行等待,注意get()会抛出InterruptedException/ExecutionException,
需要将这些Exception再封装为RuntimeException throw出去。