Skip to content

Commit

Permalink
Title(feat):Add complete loadsir support of Activity and sample to gu…
Browse files Browse the repository at this point in the history
…ide to use it.

Cause:N/A
Solution:N/A
Effect: N/A
Reviewer: N/A
附加说明:N/A
  • Loading branch information
RookieJay committed Sep 27, 2021
1 parent 71e6406 commit 555bacd
Show file tree
Hide file tree
Showing 13 changed files with 217 additions and 83 deletions.
20 changes: 12 additions & 8 deletions app/src/main/java/pers/jay/demo/common/Const.kt
Original file line number Diff line number Diff line change
@@ -1,22 +1,26 @@
package pers.jay.demo.common

import pers.jay.demo.loadsir.EmptyCallback
import pers.jay.demo.loadsir.ErrorCallback
import pers.jay.demo.loadsir.LoadingCallback
import pers.jay.demo.loadsir.RetryCallback
import pers.jay.library.loadsir.ViewStatusCallback
import pers.jay.library.loadsir.StatusCallback

/**
* Copyright (c) 2011, 北京视达科技有限责任公司 All rights reserved.
* author:juncai.zhou
* date:2021/9/26 14:44
* description:
*/
object Const {

@JvmStatic
val DEFAULT_LOADSIR_CALLBACK = ViewStatusCallback(
val DEFAULT_VIEW_STATUS_CALLBACK = StatusCallback(
LoadingCallback::class.java,
EmptyCallback::class.java,
ErrorCallback::class.java,
RetryCallback::class.java
)

@JvmStatic
val DEFAULT_ACTIVITY_STATUS_CALLBACK = StatusCallback(
LoadingCallback::class.java,
EmptyCallback::class.java,
ErrorCallback::class.java,
RetryCallback::class.java
)
}
22 changes: 11 additions & 11 deletions app/src/main/java/pers/jay/demo/databinding/InfoActivity.kt
Original file line number Diff line number Diff line change
@@ -1,18 +1,22 @@
package pers.jay.demo.databinding

import android.os.Bundle
import android.view.View
import com.blankj.utilcode.util.LogUtils
import pers.jay.demo.R
import pers.jay.demo.common.Const
import pers.jay.library.base.databinding.BaseDBVMActivity
import pers.jay.library.loadsir.StatusCallback

/**
* databinding示例
*/
class InfoActivity : BaseDBVMActivity<ActivityInfoBinding, InfoViewModel>() {

override var enableLoadSir = false
override var enableActivityLoadSir = true

override var mActivityStatusCallback: StatusCallback?
get() = Const.DEFAULT_ACTIVITY_STATUS_CALLBACK
set(value) {}

override fun initLayout(savedInstanceState: Bundle?): Int {
return R.layout.activity_info
Expand All @@ -23,24 +27,20 @@ class InfoActivity : BaseDBVMActivity<ActivityInfoBinding, InfoViewModel>() {
}

override fun initData(savedInstanceState: Bundle?) {
loadData(mBinding.tvTabName)
loadData()
}

private fun loadData(view: View) {
mViewModel.loadData().observeState(view, Const.DEFAULT_LOADSIR_CALLBACK, this) {
private fun loadData() {
// 对activity进行视图回调处理,enableActivityLoadSir要覆写
mViewModel.loadData().observeOnActivity {
onStart {

LogUtils.e(TAG, "onStart")
}
onSuccess { data ->
mLoadService?.showSuccess()
mBinding.tab = data[0]
}
onError {
LogUtils.e(TAG, "error $it")
showError(it)
}
onReload {
loadData(view)
}
}
}
Expand Down
6 changes: 0 additions & 6 deletions app/src/main/java/pers/jay/demo/databinding/JDBActivity.kt
Original file line number Diff line number Diff line change
Expand Up @@ -4,12 +4,6 @@ import androidx.databinding.ViewDataBinding
import androidx.lifecycle.ViewModel
import pers.jay.library.base.databinding.BaseDBVMActivity

/**
* Copyright (c) 2011, 北京视达科技有限责任公司 All rights reserved.
* author:juncai.zhou
* date:2021/8/31 09:31
* description:
*/
abstract class JDBActivity<DB : ViewDataBinding, VM : ViewModel>: BaseDBVMActivity<DB, VM> () {

override fun showEmpty() {
Expand Down
2 changes: 0 additions & 2 deletions app/src/main/java/pers/jay/demo/net/WanService.kt
Original file line number Diff line number Diff line change
@@ -1,7 +1,5 @@
package pers.jay.demo.net

import com.google.gson.annotations.SerializedName
import com.squareup.moshi.JsonQualifier
import pers.jay.demo.Tab
import retrofit2.http.GET

Expand Down
25 changes: 15 additions & 10 deletions app/src/main/java/pers/jay/demo/viewbinding/DemoActivity.kt
Original file line number Diff line number Diff line change
Expand Up @@ -9,12 +9,16 @@ import kotlinx.coroutines.delay
import kotlinx.coroutines.launch
import pers.jay.demo.common.Const
import pers.jay.demo.databinding.ActivityDemoBinding
import pers.jay.demo.loadsir.RetryCallback
import pers.jay.demo.vm.DemoViewModel
import pers.jay.library.base.viewbinding.BaseVBVMActivity
import pers.jay.library.loadsir.StatusCallback

class DemoActivity : BaseVBVMActivity<ActivityDemoBinding, DemoViewModel>() {

override var enableLoadSir = false
override var enableActivityLoadSir = false

override var mActivityStatusCallback: StatusCallback? = Const.DEFAULT_ACTIVITY_STATUS_CALLBACK

override fun initView(savedInstanceState: Bundle?) {
mBinding.text1.setOnClickListener {
Expand All @@ -26,24 +30,25 @@ class DemoActivity : BaseVBVMActivity<ActivityDemoBinding, DemoViewModel>() {
requestDemo(mBinding.text1)
// requestDemo(mBinding.text2)
lifecycleScope.launch(Dispatchers.Main) {
delay(2000)
delay(1000)
requestDemo(mBinding.text3)
}

}


private fun requestDemo(textView: TextView) {
mViewModel.test().observeState(textView, Const.DEFAULT_LOADSIR_CALLBACK, this) {

// 单独对view视图处理,activity不应开启loadsir注册
mViewModel.test().observeState(textView, Const.DEFAULT_VIEW_STATUS_CALLBACK, this) {
onStart {
// mLoadService?.showCallback(LoadingCallback::class.java)
LogUtils.d(TAG, "onStart")
}
onSuccess { tabs ->
LogUtils.d(TAG, tabs.toString())
textView.apply{
textView.apply {
text = tabs.toString()
}
// mLoadService?.showSuccess()
}
onEmpty {
LogUtils.d(TAG, "onEmpty")
Expand All @@ -54,11 +59,11 @@ class DemoActivity : BaseVBVMActivity<ActivityDemoBinding, DemoViewModel>() {
onCompletion {
LogUtils.d(TAG, "onCompletion ${textView.id}")
}
onReload {
LogUtils.d(TAG, "onReload")
requestDemo(textView)
}
}
}

override fun showError(message: String?) {
mLoadService?.showCallback(RetryCallback::class.java)
}

}
1 change: 1 addition & 0 deletions app/src/main/java/pers/jay/demo/vm/DemoViewModel.kt
Original file line number Diff line number Diff line change
Expand Up @@ -16,4 +16,5 @@ class DemoViewModel : BaseViewModel<DemoRepo>() {
onCompletion { }
}
}

}
2 changes: 2 additions & 0 deletions app/src/main/res/layout/activity_info.xml
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,8 @@
android:layout_height="wrap_content"
android:hint="this is a databinding page"
android:text="@{tab.name}"
android:textColor="@color/red"
android:textSize="30sp"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent"
Expand Down
100 changes: 94 additions & 6 deletions jay_lib/src/main/java/pers/jay/library/base/BaseActivity.kt
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,9 @@ import com.blankj.utilcode.util.LogUtils
import com.kingja.loadsir.core.LoadService
import com.kingja.loadsir.core.LoadSir
import pers.jay.library.app.BaseApplication
import pers.jay.library.base.livedata.StateLiveData
import pers.jay.library.lifecycle.LifecycleLogObserver
import pers.jay.library.loadsir.StatusCallback

/**
* @Author RookieJay
Expand All @@ -19,16 +21,19 @@ abstract class BaseActivity : AppCompatActivity(), IActivity {

protected val TAG: String = javaClass.simpleName

private lateinit var mContext : Context
private lateinit var mContext: Context

override fun getContext() = mContext

protected var mLoadService: LoadService<Any>? = null

/**
* [LoadSir]开关,默认关闭
*/
open var enableLoadSir = false
open var enableActivityLoadSir = false

protected var mLoadService: LoadService<Any>? = null

open var mActivityStatusCallback: StatusCallback? = null

override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
Expand Down Expand Up @@ -57,17 +62,100 @@ abstract class BaseActivity : AppCompatActivity(), IActivity {
* 初始化LoadSir,需要放在[setContentView]之后
*/
protected fun initLoadSir() {
if (!enableLoadSir) {
if (!enableActivityLoadSir) {
return
}
mLoadService = LoadSir.getDefault().register(this) {
view -> onReload(view)
if (mActivityStatusCallback == null) {
throw IllegalArgumentException("You must specify Activity StatusCallback when enable LoadSir")
}
mLoadService = LoadSir.getDefault().register(this) { view ->
onReload(view)
}
}

override fun onReload(view: View) {
LogUtils.i(TAG, "onReload, view:", view.hashCode())
}

override fun showLoading() {
super.showLoading()
mLoadService?.showCallback(mActivityStatusCallback?.loadingCallback)
}

override fun hideLoading() {
super.hideLoading()
mLoadService?.setCallBack(mActivityStatusCallback?.loadingCallback) { context, view ->
view.visibility = View.GONE
}
}

override fun showEmpty() {
super.showEmpty()
mLoadService?.showCallback(mActivityStatusCallback?.emptyCallback)
}

override fun showError(message: String?) {
super.showError(message)
mLoadService?.showCallback(mActivityStatusCallback?.errorCallback)
}

override fun showSuccess() {
super.showSuccess()
mLoadService?.showSuccess()
}

/**
* 设计目的是为了解决在activity中
*/
fun <T> StateLiveData<T>.observeOnActivity(
showLoading: Boolean = true,
listenerBuilder: StateListener<T>.() -> Unit
) {
autoObserve(showLoading, this, mActivityStatusCallback!!, listenerBuilder)
}
/**
* @desc 发起请求并根据结果自动观察,完成相应视图切换
* @param statusView 为空时,执行activity的loadSir逻辑,否则交由[StateLiveData]对view进行处理
* @return
*/
fun <T> autoObserve(
showLoading: Boolean = true,
liveData: StateLiveData<T>,
statusCallback: StatusCallback,
listenerBuilder: StateListener<T>.() -> Unit
) {
val stateListener = StateListener<T>().also(listenerBuilder)
liveData.observeState(null, statusCallback, this@BaseActivity) {
onStart {
if (showLoading) {
showLoading()
}
stateListener.startAction?.invoke()
}
onSuccess { data ->
showSuccess()
stateListener.successAction?.invoke(data)
}
onEmpty {
LogUtils.d(TAG, "onEmpty")
showEmpty()
stateListener.emptyAction?.invoke()
}
onError { msg ->
LogUtils.d(TAG, "onError, msg:$msg")
showError(msg)
stateListener.errorAction?.invoke(msg)
}
onCompletion {
LogUtils.d(TAG, "onCompletion")
hideLoading()
stateListener.completeAction?.invoke()
}
onReload {
LogUtils.d(TAG, "onReload")
autoObserve(showLoading, liveData, statusCallback, listenerBuilder)
}
}
}

}
5 changes: 5 additions & 0 deletions jay_lib/src/main/java/pers/jay/library/base/IView.kt
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,11 @@ interface IView {
*/
fun hideLoading() {}

/**
* 显示成功
*/
fun showSuccess() {}

/**
* 显示空视图
*/
Expand Down
36 changes: 36 additions & 0 deletions jay_lib/src/main/java/pers/jay/library/base/StateListener.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
package pers.jay.library.base

/**
* @Author RookieJay
* @Time 2021/9/27 15:23
* @Description 状态监听器
*/
class StateListener<T> {

var startAction: (() -> Unit)? = null
var successAction: ((T) -> Unit)? = null
var errorAction: ((String) -> Unit)? = null
var emptyAction: (() -> Unit)? = null
var completeAction: (() -> Unit)? = null

fun onStart(action: (() -> Unit)?) {
startAction = action
}

fun onSuccess(action: ((T) -> Unit)?) {
successAction = action
}

fun onError(action: ((String) -> Unit)?) {
errorAction = action
}

fun onEmpty(action: (() -> Unit)?) {
emptyAction = action
}

fun onCompletion(action: (() -> Unit)?) {
completeAction = action
}

}
Loading

0 comments on commit 555bacd

Please sign in to comment.