pull/32/head
Administrator 5 years ago
parent 78db8194dc
commit 9bff78b22f
  1. 2
      app/src/main/java/io/legado/app/data/api/CommonHttpApi.kt
  2. 89
      app/src/main/java/io/legado/app/help/coroutine/Coroutine.kt
  3. 7
      app/src/main/java/io/legado/app/help/coroutine/Function.kt
  4. 1
      app/src/main/java/io/legado/app/ui/search/SearchActivity.kt
  5. 63
      app/src/main/java/io/legado/app/ui/search/SearchViewModel.kt

@ -13,4 +13,6 @@ interface CommonHttpApi {
fun post(@Url url: String, @FieldMap map: Map<String, String>): Deferred<String> fun post(@Url url: String, @FieldMap map: Map<String, String>): Deferred<String>
@GET
fun get(@Url url: String) : Deferred<String>
} }

@ -0,0 +1,89 @@
package io.legado.app.help.coroutine
import kotlinx.coroutines.*
class Coroutine<T>(private val domain: (suspend CoroutineScope.() -> T)? = null) : CoroutineScope by MainScope() {
companion object {
fun <T> of(value: suspend CoroutineScope.() -> T): Coroutine<T> {
return Coroutine(value)
}
}
private var start: (() -> Unit)? = null
private var success: ((T?) -> Unit)? = null
private var error: ((Throwable) -> Unit)? = null
private var finally: (() -> Unit)? = null
private var value: T? = null
init {
val job: Job = launch {
tryCatch(
{
start?.let { it() }
val result: T? = withContext(Dispatchers.IO) {
domain?.let {
value = it()
return@let value
}
}
success?.let { it(result) }
},
{ e ->
error?.let { it(e) }
},
{
finally?.let { it() }
})
}
}
fun onStart(start: (() -> Unit)): Coroutine<T> {
this.start = start
return this@Coroutine
}
//
// fun <U> map(func: Function<T, U>): Coroutine<U> {
// return of { func.apply(value) }
// }
//
// fun <U> flatMap(func: Function<T, Coroutine<U>>): Coroutine<U> {
// return func.apply(value)
// }
fun onSuccess(success: (T?) -> Unit): Coroutine<T> {
this.success = success
return this@Coroutine
}
fun onError(error: (Throwable) -> Unit): Coroutine<T> {
this.error = error
return this@Coroutine
}
fun onFinally(finally: () -> Unit): Coroutine<T> {
this.finally = finally
return this@Coroutine
}
private suspend fun tryCatch(
tryBlock: suspend CoroutineScope.() -> Unit,
errorBlock: (suspend CoroutineScope.(Throwable) -> Unit)? = null,
finallyBlock: (suspend CoroutineScope.() -> Unit)? = null
) {
try {
coroutineScope { tryBlock() }
} catch (e: Throwable) {
coroutineScope { errorBlock?.let { it(e) } }
} finally {
coroutineScope { finallyBlock?.let { it() } }
}
}
}

@ -0,0 +1,7 @@
package io.legado.app.help.coroutine
interface Function<T, R> {
fun apply(t: T?): R
}

@ -14,7 +14,6 @@ class SearchActivity : BaseActivity<SearchViewModel>() {
get() = R.layout.activity_search get() = R.layout.activity_search
override fun onViewModelCreated(viewModel: SearchViewModel, savedInstanceState: Bundle?) { override fun onViewModelCreated(viewModel: SearchViewModel, savedInstanceState: Bundle?) {
} }
} }

@ -1,44 +1,65 @@
package io.legado.app.ui.search package io.legado.app.ui.search
import android.app.Application import android.app.Application
import android.util.Log
import androidx.lifecycle.LiveData import androidx.lifecycle.LiveData
import androidx.lifecycle.MutableLiveData import androidx.lifecycle.MutableLiveData
import io.legado.app.base.BaseViewModel import io.legado.app.base.BaseViewModel
import io.legado.app.data.api.CommonHttpApi import io.legado.app.data.api.CommonHttpApi
import io.legado.app.data.entities.SearchBook import io.legado.app.data.entities.SearchBook
import io.legado.app.help.coroutine.Coroutine
import io.legado.app.help.coroutine.Function
import io.legado.app.help.http.HttpHelper import io.legado.app.help.http.HttpHelper
import kotlinx.coroutines.*
import kotlinx.coroutines.Dispatchers.IO import kotlinx.coroutines.Dispatchers.IO
import kotlinx.coroutines.coroutineScope
import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext
import org.jetbrains.anko.error import org.jetbrains.anko.error
import java.lang.StringBuilder
class SearchViewModel(application: Application) : BaseViewModel(application) { class SearchViewModel(application: Application) : BaseViewModel(application) {
val searchBooks: LiveData<List<SearchBook>> = MutableLiveData() val searchBooks: LiveData<List<SearchBook>> = MutableLiveData()
fun search(start: () -> Unit, finally: () -> Unit) { fun search(start: (() -> Unit)? = null, finally: (() -> Unit)? = null) {
launchOnUI( // launchOnUI(
{ // {
start() // start?.let { it() }
val searchResponse = withContext(IO) { // val searchResponse = withContext(IO) {
HttpHelper.getApiService<CommonHttpApi>( // val response: Deferred<String> = HttpHelper.getApiService<CommonHttpApi>(
"http:www.baidu.com" // "http://www.baidu.com"
).post("", mutableMapOf(Pair("key", "value"))) // ).get("http://www.baidu.com")
} //
// }
val result = searchResponse.await() //
}, //// val result = searchResponse.await()
{ error { "${it.message}" } }, ////
{ finally() }) //// println(result)
// },
// { error { "${it.message}" } },
// { finally?.let { it() } })
launchOnUI({ val task = Coroutine.of {
//TODO val response: String = HttpHelper.getApiService<CommonHttpApi>(
}) "http://www.baidu.com"
).get("http://www.baidu.com").await()
launch { Log.e("TAG1", Thread.currentThread().name)
response
}
.onStart {
Log.e("TAG!", "start")
}
.onSuccess {
Log.e("TAG!", "success: $it")
} }
.onError {
error { "${it.message}" }
}
.onFinally {
Log.e("TAG!", "finally")
}
// task.cancel()
} }
} }

Loading…
Cancel
Save