package Ġcom . ch ay ang ko on . champ . link preview . common Ċ Ċ import Ġandroid . os . Handler Ċ import Ġandroid . os . Looper Ċ import Ġandroid . util . Log Ċ import Ġandroidx . arch . core . executor . Arch Task Executor Ċ import Ġjava . util . concurrent .* Ċ import Ġjava . util . concurrent . atomic . Atomic Integer ĊĊ Ċ internal Ġclass ĠDefault Link Preview Executor ( load Executor : ĠExecutor ? Ġ= Ġnull ) Ġ: ĠLink Preview Executor () Ġ{ ĊĠĠĠ Ġprivate Ġval Ġlock Ġ= ĠAny () ĊĠĠĠ Ġprivate Ġvar Ġbackground Thread Executor : ĠExecutor ĊĊĠĠĠ Ġ@ Volatile ĊĠĠĠ Ġprivate Ġvar Ġmain Handler : ĠHandler ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġrunnable : ĠRunnable ? Ġ= Ġnull ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġbackground Thread Executor Ġ= Ġload Executor Ġ?: ĠExec utors . new Fixed ThreadPool ( 2 , Ġobject Ġ: ĠThread Factory Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġval Ġm Thread Id Ġ= ĠAtomicInteger ( 0 ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġnew Thread ( r : ĠRunnable ): ĠThread Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠThread ( r ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġname Ġ= ĠString . format ( THREAD _ NAME _ STEM , Ġm Thread Id . get And Increment ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġexecute On Background Thread ( run nable : ĠRunnable ) Ġ{ ĊĠĠĠĠĠĠĠ Ġbackground Thread Executor . execute ( run nable ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġcancel On Background Thread () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( background Thread Executor Ġis ĠExecutor Service ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbackground Thread Executor Ġ= Ġ( background Thread Executor Ġas ĠExecutor Service ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbackground Thread Executor . shutdown () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! background Thread Executor . await Termination ( 5 , ĠTimeUnit . SECONDS )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbackground Thread Executor . shutdown Now () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! background Thread Executor . await Termination ( 5 , ĠTimeUnit . SECONDS )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . e (" cancel On Disk IO ", Ġ" Pool Ġdid Ġnot Ġterminate ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( ie : ĠInterruptedException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbackground Thread Executor . shutdown Now () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠThread . currentThread (). interrupt () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġpost To MainThread ( run nable : ĠRunnable ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( main Handler Ġ== Ġnull ) Ġsynchronized ( lock ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( main Handler Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmain Handler Ġ= ĠHandler ( Looper . get Main Looper ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġthis . run nable Ġ= Ġrunnable ĊĠĠĠĠĠĠĠ Ġmain Handler ?. post ( run nable ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġcancel On MainThread () Ġ{ ĊĠĠĠĠĠĠĠ Ġrunnable ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmain Handler ?. remove Callbacks ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrunnable Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġis MainThread (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠL ooper . get Main Looper (). thread Ġ=== ĠThread . currentThread () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠTHREAD _ NAME _ STEM : ĠString Ġ= Ġ" link _ preview _ disk _ io _% d " ĊĠĠĠ Ġ} Ċ }