package Ġcom . str v . k tools Ċ Ċ import Ġandroid . os . Handler Ċ import Ġandroid . os . Looper Ċ import Ġjava . lang . ref . Weak Reference Ċ import Ġjava . util . concurrent . ExecutorService Ċ import Ġjava . util . concurrent . Executors Ċ import Ġjava . util . concurrent . Future Ċ Ċ class ĠAn ko Async Context < T >( val Ġweak Ref : ĠWeak Reference < T >) Ċ Ċ fun Ġ< T > ĠAn ko Async Context < T >. ui Thread ( f : Ġ( T ) Ġ-> ĠUnit ): ĠBoolean Ġ{ Ċ ĉ val Ġref Ġ= Ġweak Ref . get () Ġ?: Ġreturn Ġfalse Ċ ĉ if Ġ( Context Helper . main Thread Ġ== ĠThread . currentThread ()) Ġ{ Ċĉ ĉ f ( ref ) Ċ ĉ } Ġelse Ġ{ Ċĉ ĉ Context Helper . handler . post Ġ{ Ġf ( ref ) Ġ} Ċ ĉ } Ċ ĉ return Ġtrue Ċ } Ċ Ċ fun Ġ< T > ĠT . do Async ( Ċ ĉ exception Handler : Ġ(( Throwable ) Ġ-> ĠUnit )? Ġ= Ġnull , Ċ ĉ task : ĠAn ko Async Context < T >. () Ġ-> ĠUnit Ċ ): ĠFuture < Unit > Ġ{ Ċ ĉ val Ġcontext Ġ= ĠAn ko Async Context ( Weak Reference ( this )) Ċ ĉ return ĠBackground Executor . submit Ġ{ Ċĉ ĉ try Ġ{ Ċĉĉ ĉ context . task () Ċĉ ĉ } Ġcatch Ġ( thr : ĠThrowable ) Ġ{ Ċĉĉ ĉ exception Handler ?. invoke ( thr ) Ġ?: ĠUnit Ċĉ ĉ } Ċ ĉ } Ċ } Ċ Ċ internal Ġobject ĠBackground Executor Ġ{ Ċ ĉ var Ġexecutor : ĠExecutor Service Ġ= Ċĉ ĉ Executors . new Scheduled ThreadPool ( 2 Ġ* ĠRuntime . get Runtime (). available Processors ()) ĊĊ ĉ fun Ġ< T > Ġsubmit ( task : Ġ() Ġ-> ĠT ): ĠFuture < T > Ġ{ Ċĉ ĉ return Ġexecutor . submit ( task ) Ċ ĉ } Ċ Ċ } Ċ Ċ private Ġobject ĠContext Helper Ġ{ Ċ ĉ val Ġhandler Ġ= ĠHandler ( Looper . get Main Looper ()) Ċ ĉ val Ġmain Thread Ġ= ĠL ooper . get Main Looper (). thread Ċ } Ċ