kunfei 4 лет назад
Родитель
Сommit
ab7b139bc7

+ 7 - 16
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<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() {

+ 8 - 8
app/src/main/java/io/legado/app/ui/book/search/SearchActivity.kt

@@ -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) {

+ 22 - 22
app/src/main/java/io/legado/app/ui/book/search/SearchViewModel.kt

@@ -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)