pull/32/head
Administrator 5 years ago
parent 0ecdef542e
commit 4894d51863
  1. 4
      app/src/main/java/io/legado/app/base/BaseViewModel.kt
  2. 56
      app/src/main/java/io/legado/app/help/coroutine/Coroutine.kt
  3. 7
      app/src/main/java/io/legado/app/ui/search/SearchViewModel.kt

@ -20,10 +20,6 @@ open class BaseViewModel(application: Application) : AndroidViewModel(applicatio
return Coroutine.async(scope) { block().await() } return Coroutine.async(scope) { block().await() }
} }
fun <T> plus(coroutine: Coroutine<T>): Coroutine<T> {
return Coroutine.plus(coroutine)
}
override fun onCleared() { override fun onCleared() {
super.onCleared() super.onCleared()
cancel() cancel()

@ -3,7 +3,7 @@ package io.legado.app.help.coroutine
import kotlinx.coroutines.* import kotlinx.coroutines.*
class Coroutine<T>() { class Coroutine<T>(scope: CoroutineScope, block: suspend CoroutineScope.() -> T) {
companion object { companion object {
@ -13,13 +13,9 @@ class Coroutine<T>() {
return Coroutine(scope, block) return Coroutine(scope, block)
} }
fun <T> plus(coroutine: Coroutine<T>): Coroutine<T> {
return Coroutine(coroutine)
}
} }
private var interceptor: Coroutine<T>? = null private val job: Job
private lateinit var job: Job
private var start: (suspend CoroutineScope.() -> Unit)? = null private var start: (suspend CoroutineScope.() -> Unit)? = null
private var execute: (suspend CoroutineScope.(T?) -> Unit)? = null private var execute: (suspend CoroutineScope.(T?) -> Unit)? = null
@ -40,80 +36,54 @@ class Coroutine<T>() {
val isCompleted: Boolean val isCompleted: Boolean
get() = job.isCompleted get() = job.isCompleted
private constructor( init {
scope: CoroutineScope,
block: suspend CoroutineScope.() -> T
) : this() {
this.job = scope.plus(Dispatchers.Main).launch { this.job = scope.plus(Dispatchers.Main).launch {
executeInternal(this@launch, block) executeInternal(this@launch, block)
} }
} }
private constructor(coroutine: Coroutine<T>) : this() {
this.interceptor = coroutine
this.job = coroutine.job
}
fun timeout(timeMillis: () -> Long): Coroutine<T> { fun timeout(timeMillis: () -> Long): Coroutine<T> {
if (this.interceptor != null) {
this.interceptor!!.timeMillis = timeMillis()
} else {
this.timeMillis = timeMillis() this.timeMillis = timeMillis()
return this@Coroutine
} }
fun timeout(timeMillis: Long): Coroutine<T> {
this.timeMillis = timeMillis
return this@Coroutine return this@Coroutine
} }
fun onErrorReturn(value: () -> T?): Coroutine<T> { fun onErrorReturn(value: () -> T?): Coroutine<T> {
if (this.interceptor != null) { this.errorReturn = Result(value())
this.interceptor!!.errorReturn = Result(value()) return this@Coroutine
} else {
errorReturn = Result(value())
} }
fun onErrorReturn(value: T?): Coroutine<T> {
this.errorReturn = Result(value)
return this@Coroutine return this@Coroutine
} }
fun onStart(start: (suspend CoroutineScope.() -> Unit)): Coroutine<T> { fun onStart(start: (suspend CoroutineScope.() -> Unit)): Coroutine<T> {
if (this.interceptor != null) {
this.interceptor!!.start = start
} else {
this.start = start this.start = start
}
return this@Coroutine return this@Coroutine
} }
fun onExecute(execute: suspend CoroutineScope.(T?) -> Unit): Coroutine<T> { fun onExecute(execute: suspend CoroutineScope.(T?) -> Unit): Coroutine<T> {
if (this.interceptor != null) {
this.interceptor!!.execute = execute
} else {
this.execute = execute this.execute = execute
}
return this@Coroutine return this@Coroutine
} }
fun onSuccess(success: suspend CoroutineScope.(T?) -> Unit): Coroutine<T> { fun onSuccess(success: suspend CoroutineScope.(T?) -> Unit): Coroutine<T> {
if (this.interceptor != null) {
this.interceptor!!.success = success
} else {
this.success = success this.success = success
}
return this@Coroutine return this@Coroutine
} }
fun onError(error: suspend CoroutineScope.(Throwable) -> Unit): Coroutine<T> { fun onError(error: suspend CoroutineScope.(Throwable) -> Unit): Coroutine<T> {
if (this.interceptor != null) {
this.interceptor!!.error = error
} else {
this.error = error this.error = error
}
return this@Coroutine return this@Coroutine
} }
fun onFinally(finally: suspend CoroutineScope.() -> Unit): Coroutine<T> { fun onFinally(finally: suspend CoroutineScope.() -> Unit): Coroutine<T> {
if (this.interceptor != null) {
this.interceptor!!.finally = finally
} else {
this.finally = finally this.finally = finally
}
return this@Coroutine return this@Coroutine
} }
@ -122,7 +92,7 @@ class Coroutine<T>() {
job.cancel(cause) job.cancel(cause)
} }
fun invokeOnCompletion(handler: CompletionHandler): DisposableHandle{ fun invokeOnCompletion(handler: CompletionHandler): DisposableHandle {
return job.invokeOnCompletion(handler) return job.invokeOnCompletion(handler)
} }

@ -4,8 +4,10 @@ import android.app.Application
import android.util.Log import android.util.Log
import io.legado.app.App import io.legado.app.App
import io.legado.app.base.BaseViewModel import io.legado.app.base.BaseViewModel
import io.legado.app.data.entities.SearchBook
import io.legado.app.help.coroutine.Coroutine import io.legado.app.help.coroutine.Coroutine
import io.legado.app.model.WebBook import io.legado.app.model.WebBook
import kotlinx.coroutines.CoroutineScope
class SearchViewModel(application: Application) : BaseViewModel(application) { class SearchViewModel(application: Application) : BaseViewModel(application) {
private var task: Coroutine<*>? = null private var task: Coroutine<*>? = null
@ -26,8 +28,8 @@ class SearchViewModel(application: Application) : BaseViewModel(application) {
for (item in bookSourceList) { for (item in bookSourceList) {
//task取消时自动取消 by (scope = this@execute) //task取消时自动取消 by (scope = this@execute)
WebBook(item).searchBook(key, searchPage, scope = this@execute) WebBook(item).searchBook(key, searchPage, scope = this@execute)
.timeout { 30000L } .timeout(30000L)
.onExecute { .onExecute{
it?.let { list -> it?.let { list ->
App.db.searchBookDao().insert(*list.toTypedArray()) App.db.searchBookDao().insert(*list.toTypedArray())
} }
@ -39,7 +41,6 @@ class SearchViewModel(application: Application) : BaseViewModel(application) {
} }
task?.invokeOnCompletion { task?.invokeOnCompletion {
Log.e("TAG", "complete")
finally?.invoke() finally?.invoke()
} }
} }

Loading…
Cancel
Save