commit
cfd51d959d
@ -0,0 +1,85 @@ |
||||
package io.legado.app.help.coroutine |
||||
|
||||
class CompositeCoroutine : CoroutineContainer { |
||||
|
||||
private var resources: HashSet<Coroutine<*>>? = null |
||||
|
||||
val size: Int |
||||
get() = resources?.size ?: 0 |
||||
|
||||
val isEmpty: Boolean |
||||
get() = size == 0 |
||||
|
||||
constructor() |
||||
|
||||
constructor(vararg coroutines: Coroutine<*>) { |
||||
this.resources = hashSetOf(*coroutines) |
||||
} |
||||
|
||||
constructor(coroutines: Iterable<Coroutine<*>>) { |
||||
this.resources = hashSetOf() |
||||
for (d in coroutines) { |
||||
this.resources?.add(d) |
||||
} |
||||
} |
||||
|
||||
override fun add(coroutine: Coroutine<*>): Boolean { |
||||
synchronized(this) { |
||||
var set: HashSet<Coroutine<*>>? = resources |
||||
if (resources == null) { |
||||
set = hashSetOf() |
||||
resources = set |
||||
} |
||||
return set!!.add(coroutine) |
||||
} |
||||
} |
||||
|
||||
override fun addAll(vararg coroutines: Coroutine<*>): Boolean { |
||||
synchronized(this) { |
||||
var set: HashSet<Coroutine<*>>? = resources |
||||
if (resources == null) { |
||||
set = hashSetOf() |
||||
resources = set |
||||
} |
||||
for (coroutine in coroutines) { |
||||
val add = set!!.add(coroutine) |
||||
if (!add) { |
||||
return false |
||||
} |
||||
} |
||||
} |
||||
return true |
||||
} |
||||
|
||||
override fun remove(coroutine: Coroutine<*>): Boolean { |
||||
if (delete(coroutine)) { |
||||
coroutine.cancel() |
||||
return true |
||||
} |
||||
return false |
||||
} |
||||
|
||||
override fun delete(coroutine: Coroutine<*>): Boolean { |
||||
synchronized(this) { |
||||
val set = resources |
||||
if (set == null || !set.remove(coroutine)) { |
||||
return false |
||||
} |
||||
} |
||||
return true |
||||
} |
||||
|
||||
override fun clear() { |
||||
val set: HashSet<Coroutine<*>>? |
||||
synchronized(this) { |
||||
set = resources |
||||
resources = null |
||||
} |
||||
|
||||
set?.forEach { |
||||
runCatching { |
||||
it.cancel() |
||||
} |
||||
} |
||||
} |
||||
} |
@ -0,0 +1,15 @@ |
||||
package io.legado.app.help.coroutine |
||||
|
||||
interface CoroutineContainer { |
||||
|
||||
fun add(coroutine: Coroutine<*>): Boolean |
||||
|
||||
fun addAll(vararg coroutines: Coroutine<*>): Boolean |
||||
|
||||
fun remove(coroutine: Coroutine<*>): Boolean |
||||
|
||||
fun delete(coroutine: Coroutine<*>): Boolean |
||||
|
||||
fun clear() |
||||
|
||||
} |
Loading…
Reference in new issue