This commit is contained in:
Horis
2025-06-13 15:35:17 +08:00
parent b02872b2c8
commit 015b7972c7
3 changed files with 33 additions and 0 deletions
@@ -17,8 +17,10 @@ import kotlinx.coroutines.Job
import kotlinx.coroutines.asCoroutineDispatcher import kotlinx.coroutines.asCoroutineDispatcher
import kotlinx.coroutines.currentCoroutineContext import kotlinx.coroutines.currentCoroutineContext
import kotlinx.coroutines.ensureActive import kotlinx.coroutines.ensureActive
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.catch import kotlinx.coroutines.flow.catch
import kotlinx.coroutines.flow.collect import kotlinx.coroutines.flow.collect
import kotlinx.coroutines.flow.first
import kotlinx.coroutines.flow.flow import kotlinx.coroutines.flow.flow
import kotlinx.coroutines.flow.onCompletion import kotlinx.coroutines.flow.onCompletion
import kotlinx.coroutines.flow.onEach import kotlinx.coroutines.flow.onEach
@@ -39,6 +41,7 @@ class SearchModel(private val scope: CoroutineScope, private val callBack: CallB
private var bookSourceParts = emptyList<BookSourcePart>() private var bookSourceParts = emptyList<BookSourcePart>()
private var searchBooks = arrayListOf<SearchBook>() private var searchBooks = arrayListOf<SearchBook>()
private var searchJob: Job? = null private var searchJob: Job? = null
private var workingState = MutableStateFlow(true)
private fun initSearchPool() { private fun initSearchPool() {
@@ -80,6 +83,7 @@ class SearchModel(private val scope: CoroutineScope, private val callBack: CallB
bs.getBookSource()?.let { bs.getBookSource()?.let {
emit(it) emit(it)
} }
workingState.first { it }
} }
}.onStart { }.onStart {
callBack.onSearchStart() callBack.onSearchStart()
@@ -176,6 +180,14 @@ class SearchModel(private val scope: CoroutineScope, private val callBack: CallB
} }
} }
fun pause() {
workingState.value = false
}
fun resume() {
workingState.value = true
}
fun cancelSearch() { fun cancelSearch() {
close() close()
callBack.onSearchCancel() callBack.onSearchCancel()
@@ -12,7 +12,9 @@ import androidx.activity.viewModels
import androidx.appcompat.widget.SearchView import androidx.appcompat.widget.SearchView
import androidx.core.os.bundleOf import androidx.core.os.bundleOf
import androidx.core.view.isVisible import androidx.core.view.isVisible
import androidx.lifecycle.Lifecycle
import androidx.lifecycle.lifecycleScope import androidx.lifecycle.lifecycleScope
import androidx.lifecycle.repeatOnLifecycle
import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView import androidx.recyclerview.widget.RecyclerView
import com.google.android.flexbox.FlexboxLayoutManager import com.google.android.flexbox.FlexboxLayoutManager
@@ -49,6 +51,7 @@ import io.legado.app.utils.viewbindingdelegate.viewBinding
import io.legado.app.utils.visible import io.legado.app.utils.visible
import kotlinx.coroutines.Dispatchers.IO import kotlinx.coroutines.Dispatchers.IO
import kotlinx.coroutines.Job import kotlinx.coroutines.Job
import kotlinx.coroutines.awaitCancellation
import kotlinx.coroutines.flow.catch import kotlinx.coroutines.flow.catch
import kotlinx.coroutines.flow.conflate import kotlinx.coroutines.flow.conflate
import kotlinx.coroutines.flow.flowOn import kotlinx.coroutines.flow.flowOn
@@ -304,6 +307,16 @@ class SearchActivity : VMBaseActivity<ActivityBookSearchBinding, SearchViewModel
groups = it groups = it
} }
} }
lifecycleScope.launch {
repeatOnLifecycle(Lifecycle.State.RESUMED) {
viewModel.resume()
try {
awaitCancellation()
} finally {
viewModel.pause()
}
}
}
} }
/** /**
@@ -117,6 +117,14 @@ class SearchViewModel(application: Application) : BaseViewModel(application) {
searchModel.cancelSearch() searchModel.cancelSearch()
} }
fun pause() {
searchModel.pause()
}
fun resume() {
searchModel.resume()
}
/** /**
* 保存搜索关键字 * 保存搜索关键字
*/ */