diff --git a/app/src/main/java/io/legado/app/model/webBook/SearchModel.kt b/app/src/main/java/io/legado/app/model/webBook/SearchModel.kt index c8cc3b82f..33f79d462 100644 --- a/app/src/main/java/io/legado/app/model/webBook/SearchModel.kt +++ b/app/src/main/java/io/legado/app/model/webBook/SearchModel.kt @@ -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() private var searchBooks = arrayListOf() - 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() { diff --git a/app/src/main/java/io/legado/app/ui/book/search/SearchActivity.kt b/app/src/main/java/io/legado/app/ui/book/search/SearchActivity.kt index 58fdccdef..d04b0b7d7 100644 --- a/app/src/main/java/io/legado/app/ui/book/search/SearchActivity.kt +++ b/app/src/main/java/io/legado/app/ui/book/search/SearchActivity.kt @@ -86,12 +86,12 @@ class SearchActivity : VMBaseActivity) { + 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() var searchKey: String = "" private var searchID = 0L - + private var searchFlowCallBack: ((searchBooks: ArrayList) -> Unit)? = null val searchDataFlow = callbackFlow { - val callback = object : SearchModel.CallBack { - override fun onSearchStart() { - isSearchLiveData.postValue(true) - } - - override fun onSearchSuccess(searchBooks: ArrayList) { - 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)