优化
This commit is contained in:
@@ -11,7 +11,6 @@ import android.widget.TextView
|
|||||||
import androidx.activity.viewModels
|
import androidx.activity.viewModels
|
||||||
import androidx.appcompat.widget.SearchView
|
import androidx.appcompat.widget.SearchView
|
||||||
import androidx.core.view.isVisible
|
import androidx.core.view.isVisible
|
||||||
import androidx.lifecycle.lifecycleScope
|
|
||||||
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
|
||||||
@@ -31,7 +30,6 @@ import io.legado.app.utils.*
|
|||||||
import io.legado.app.utils.viewbindingdelegate.viewBinding
|
import io.legado.app.utils.viewbindingdelegate.viewBinding
|
||||||
import kotlinx.coroutines.Dispatchers.IO
|
import kotlinx.coroutines.Dispatchers.IO
|
||||||
import kotlinx.coroutines.Job
|
import kotlinx.coroutines.Job
|
||||||
import kotlinx.coroutines.delay
|
|
||||||
import kotlinx.coroutines.flow.conflate
|
import kotlinx.coroutines.flow.conflate
|
||||||
import kotlinx.coroutines.launch
|
import kotlinx.coroutines.launch
|
||||||
import kotlinx.coroutines.withContext
|
import kotlinx.coroutines.withContext
|
||||||
@@ -277,11 +275,8 @@ class SearchActivity : VMBaseActivity<ActivityBookSearchBinding, SearchViewModel
|
|||||||
searchFinally()
|
searchFinally()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
lifecycleScope.launchWhenStarted {
|
viewModel.searchBookLiveData.observe(this) {
|
||||||
viewModel.searchDataFlow.conflate().collect {
|
adapter.setItems(it)
|
||||||
adapter.setItems(it)
|
|
||||||
delay(1000)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
launch {
|
launch {
|
||||||
appDb.bookSourceDao.flowEnabledGroups().collect {
|
appDb.bookSourceDao.flowEnabledGroups().collect {
|
||||||
|
|||||||
@@ -1,6 +1,8 @@
|
|||||||
package io.legado.app.ui.book.search
|
package io.legado.app.ui.book.search
|
||||||
|
|
||||||
import android.app.Application
|
import android.app.Application
|
||||||
|
import android.os.Handler
|
||||||
|
import android.os.Looper
|
||||||
import androidx.lifecycle.MutableLiveData
|
import androidx.lifecycle.MutableLiveData
|
||||||
import androidx.lifecycle.viewModelScope
|
import androidx.lifecycle.viewModelScope
|
||||||
import io.legado.app.base.BaseViewModel
|
import io.legado.app.base.BaseViewModel
|
||||||
@@ -11,18 +13,23 @@ import io.legado.app.data.entities.SearchKeyword
|
|||||||
import io.legado.app.help.config.AppConfig
|
import io.legado.app.help.config.AppConfig
|
||||||
import io.legado.app.model.webBook.SearchModel
|
import io.legado.app.model.webBook.SearchModel
|
||||||
import io.legado.app.utils.toastOnUi
|
import io.legado.app.utils.toastOnUi
|
||||||
import kotlinx.coroutines.Dispatchers.IO
|
|
||||||
import kotlinx.coroutines.ExperimentalCoroutinesApi
|
import kotlinx.coroutines.ExperimentalCoroutinesApi
|
||||||
import kotlinx.coroutines.channels.awaitClose
|
|
||||||
import kotlinx.coroutines.flow.callbackFlow
|
|
||||||
import kotlinx.coroutines.flow.flowOn
|
|
||||||
import kotlinx.coroutines.flow.mapLatest
|
import kotlinx.coroutines.flow.mapLatest
|
||||||
|
|
||||||
@OptIn(ExperimentalCoroutinesApi::class)
|
@OptIn(ExperimentalCoroutinesApi::class)
|
||||||
class SearchViewModel(application: Application) : BaseViewModel(application) {
|
class SearchViewModel(application: Application) : BaseViewModel(application) {
|
||||||
|
val handler = Handler(Looper.getMainLooper())
|
||||||
val bookshelf = hashSetOf<String>()
|
val bookshelf = hashSetOf<String>()
|
||||||
val upAdapterLiveData = MutableLiveData<String>()
|
val upAdapterLiveData = MutableLiveData<String>()
|
||||||
|
var searchBookLiveData = MutableLiveData<List<SearchBook>>()
|
||||||
val searchScope: SearchScope = SearchScope(AppConfig.searchScope)
|
val searchScope: SearchScope = SearchScope(AppConfig.searchScope)
|
||||||
|
var searchFinishCallback: ((isEmpty: Boolean) -> Unit)? = null
|
||||||
|
var isSearchLiveData = MutableLiveData<Boolean>()
|
||||||
|
var searchKey: String = ""
|
||||||
|
private var searchID = 0L
|
||||||
|
private var searchResult = arrayListOf<SearchBook>()
|
||||||
|
private val sendRunnable = Runnable { upAdapter() }
|
||||||
|
private var postTime = 0L
|
||||||
private val searchModel = SearchModel(viewModelScope, object : SearchModel.CallBack {
|
private val searchModel = SearchModel(viewModelScope, object : SearchModel.CallBack {
|
||||||
|
|
||||||
override fun getSearchScope(): SearchScope {
|
override fun getSearchScope(): SearchScope {
|
||||||
@@ -34,7 +41,8 @@ class SearchViewModel(application: Application) : BaseViewModel(application) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
override fun onSearchSuccess(searchBooks: ArrayList<SearchBook>) {
|
override fun onSearchSuccess(searchBooks: ArrayList<SearchBook>) {
|
||||||
searchFlowCallBack?.invoke(searchBooks)
|
searchResult = searchBooks
|
||||||
|
upAdapter()
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun onSearchFinish(isEmpty: Boolean) {
|
override fun onSearchFinish(isEmpty: Boolean) {
|
||||||
@@ -50,22 +58,6 @@ class SearchViewModel(application: Application) : BaseViewModel(application) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
})
|
})
|
||||||
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 {
|
|
||||||
|
|
||||||
searchFlowCallBack = {
|
|
||||||
trySend(ArrayList(it))
|
|
||||||
}
|
|
||||||
|
|
||||||
awaitClose {
|
|
||||||
searchFlowCallBack = null
|
|
||||||
}
|
|
||||||
}.flowOn(IO)
|
|
||||||
|
|
||||||
|
|
||||||
init {
|
init {
|
||||||
execute {
|
execute {
|
||||||
@@ -81,6 +73,18 @@ class SearchViewModel(application: Application) : BaseViewModel(application) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Synchronized
|
||||||
|
private fun upAdapter() {
|
||||||
|
if (System.currentTimeMillis() >= postTime + 1000) {
|
||||||
|
handler.removeCallbacks(sendRunnable)
|
||||||
|
postTime = System.currentTimeMillis()
|
||||||
|
searchBookLiveData.postValue(searchResult)
|
||||||
|
} else {
|
||||||
|
handler.removeCallbacks(sendRunnable)
|
||||||
|
handler.postDelayed(sendRunnable, 1000 - System.currentTimeMillis() + postTime)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 开始搜索
|
* 开始搜索
|
||||||
*/
|
*/
|
||||||
|
|||||||
Reference in New Issue
Block a user