mirror of
https://github.com/gedoor/legado.git
synced 2025-08-10 00:52:30 +00:00
优化
This commit is contained in:
@@ -16,7 +16,7 @@ import splitties.init.appCtx
|
||||
import java.util.concurrent.Executors
|
||||
import kotlin.math.min
|
||||
|
||||
class SearchModel(private val scope: CoroutineScope) {
|
||||
class SearchModel(private val scope: CoroutineScope, private val callBack: CallBack) {
|
||||
val threadCount = AppConfig.threadCount
|
||||
private var searchPool: ExecutorCoroutineDispatcher? = null
|
||||
private var mSearchId = 0L
|
||||
@@ -25,19 +25,10 @@ class SearchModel(private val scope: CoroutineScope) {
|
||||
private var tasks = CompositeCoroutine()
|
||||
private var bookSourceList = arrayListOf<BookSource>()
|
||||
private var searchBooks = arrayListOf<SearchBook>()
|
||||
private var callBack: CallBack? = null
|
||||
|
||||
@Volatile
|
||||
private var searchIndex = -1
|
||||
|
||||
fun registerCallback(callBack: CallBack) {
|
||||
this.callBack = callBack
|
||||
}
|
||||
|
||||
fun unRegisterCallback() {
|
||||
this.callBack = null
|
||||
}
|
||||
|
||||
private fun initSearchPool() {
|
||||
searchPool?.close()
|
||||
searchPool = Executors
|
||||
@@ -45,10 +36,10 @@ class SearchModel(private val scope: CoroutineScope) {
|
||||
}
|
||||
|
||||
fun search(searchId: Long, key: String) {
|
||||
callBack?.onSearchStart()
|
||||
callBack.onSearchStart()
|
||||
if (searchId != mSearchId) {
|
||||
if (key.isEmpty()) {
|
||||
callBack?.onSearchCancel()
|
||||
callBack.onSearchCancel()
|
||||
return
|
||||
} else {
|
||||
this.searchKey = key
|
||||
@@ -62,7 +53,7 @@ class SearchModel(private val scope: CoroutineScope) {
|
||||
val searchGroup = AppConfig.searchGroup
|
||||
bookSourceList.clear()
|
||||
searchBooks.clear()
|
||||
callBack?.onSearchSuccess(searchBooks)
|
||||
callBack.onSearchSuccess(searchBooks)
|
||||
if (searchGroup.isBlank()) {
|
||||
bookSourceList.addAll(appDb.bookSourceDao.allEnabled)
|
||||
} else {
|
||||
@@ -114,7 +105,7 @@ class SearchModel(private val scope: CoroutineScope) {
|
||||
appDb.searchBookDao.insert(*items.toTypedArray())
|
||||
val precision = appCtx.getPrefBoolean(PreferKey.precisionSearch)
|
||||
mergeItems(scope, items, precision)
|
||||
callBack?.onSearchSuccess(searchBooks)
|
||||
callBack.onSearchSuccess(searchBooks)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -128,7 +119,7 @@ class SearchModel(private val scope: CoroutineScope) {
|
||||
if (searchIndex >= bookSourceList.lastIndex
|
||||
+ min(bookSourceList.size, threadCount)
|
||||
) {
|
||||
callBack?.onSearchFinish(searchBooks.isEmpty())
|
||||
callBack.onSearchFinish(searchBooks.isEmpty())
|
||||
}
|
||||
}
|
||||
|
||||
@@ -201,7 +192,7 @@ class SearchModel(private val scope: CoroutineScope) {
|
||||
|
||||
fun cancelSearch() {
|
||||
close()
|
||||
callBack?.onSearchCancel()
|
||||
callBack.onSearchCancel()
|
||||
}
|
||||
|
||||
fun close() {
|
||||
|
||||
@@ -86,12 +86,12 @@ class SearchActivity : VMBaseActivity<ActivityBookSearchBinding, SearchViewModel
|
||||
|
||||
override fun onActivityCreated(savedInstanceState: Bundle?) {
|
||||
binding.llHistory.setBackgroundColor(backgroundColor)
|
||||
viewModel.searchFinishCallback = searchFinishCallback
|
||||
initRecyclerView()
|
||||
initSearchView()
|
||||
initOtherView()
|
||||
initData()
|
||||
receiptIntent(intent)
|
||||
viewModel.searchFinishCallback = searchFinishCallback
|
||||
}
|
||||
|
||||
override fun onNewIntent(data: Intent?) {
|
||||
@@ -219,6 +219,13 @@ class SearchActivity : VMBaseActivity<ActivityBookSearchBinding, SearchViewModel
|
||||
}
|
||||
|
||||
private fun initData() {
|
||||
viewModel.isSearchLiveData.observe(this) {
|
||||
if (it) {
|
||||
startSearch()
|
||||
} else {
|
||||
searchFinally()
|
||||
}
|
||||
}
|
||||
lifecycleScope.launchWhenStarted {
|
||||
viewModel.searchDataFlow.conflate().collect {
|
||||
adapter.setItems(it)
|
||||
@@ -234,13 +241,6 @@ class SearchActivity : VMBaseActivity<ActivityBookSearchBinding, SearchViewModel
|
||||
upGroupMenu()
|
||||
}
|
||||
}
|
||||
viewModel.isSearchLiveData.observe(this) {
|
||||
if (it) {
|
||||
startSearch()
|
||||
} else {
|
||||
searchFinally()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private fun receiptIntent(intent: Intent? = null) {
|
||||
|
||||
@@ -14,37 +14,37 @@ import kotlinx.coroutines.flow.callbackFlow
|
||||
import kotlinx.coroutines.flow.flowOn
|
||||
|
||||
class SearchViewModel(application: Application) : BaseViewModel(application) {
|
||||
private val searchModel = SearchModel(viewModelScope)
|
||||
private val searchModel = SearchModel(viewModelScope, object : SearchModel.CallBack {
|
||||
override fun onSearchStart() {
|
||||
isSearchLiveData.postValue(true)
|
||||
}
|
||||
|
||||
override fun onSearchSuccess(searchBooks: ArrayList<SearchBook>) {
|
||||
searchFlowCallBack?.invoke(searchBooks)
|
||||
}
|
||||
|
||||
override fun onSearchFinish(isEmpty: Boolean) {
|
||||
isSearchLiveData.postValue(false)
|
||||
searchFinishCallback?.invoke(isEmpty)
|
||||
}
|
||||
|
||||
override fun onSearchCancel() {
|
||||
isSearchLiveData.postValue(false)
|
||||
}
|
||||
})
|
||||
var searchFinishCallback: ((isEmpty: Boolean) -> Unit)? = null
|
||||
var isSearchLiveData = MutableLiveData<Boolean>()
|
||||
var searchKey: String = ""
|
||||
private var searchID = 0L
|
||||
|
||||
private var searchFlowCallBack: ((searchBooks: ArrayList<SearchBook>) -> Unit)? = null
|
||||
val searchDataFlow = callbackFlow {
|
||||
|
||||
val callback = object : SearchModel.CallBack {
|
||||
override fun onSearchStart() {
|
||||
isSearchLiveData.postValue(true)
|
||||
}
|
||||
|
||||
override fun onSearchSuccess(searchBooks: ArrayList<SearchBook>) {
|
||||
trySend(ArrayList(searchBooks))
|
||||
}
|
||||
|
||||
override fun onSearchFinish(isEmpty: Boolean) {
|
||||
isSearchLiveData.postValue(false)
|
||||
searchFinishCallback?.invoke(isEmpty)
|
||||
}
|
||||
|
||||
override fun onSearchCancel() {
|
||||
isSearchLiveData.postValue(false)
|
||||
}
|
||||
searchFlowCallBack = {
|
||||
trySend(ArrayList(it))
|
||||
}
|
||||
|
||||
searchModel.registerCallback(callback)
|
||||
|
||||
awaitClose {
|
||||
searchModel.unRegisterCallback()
|
||||
searchFlowCallBack = null
|
||||
}
|
||||
}.flowOn(IO)
|
||||
|
||||
|
||||
Reference in New Issue
Block a user