Skip to content

Commit fe2a6e9

Browse files
author
jiewang41
committed
[代码修改] 网络请求逻辑优化
1 parent dfd003d commit fe2a6e9

32 files changed

+328
-247
lines changed

app/src/main/kotlin/com/wj/sampleproject/activity/MainActivity.kt

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,14 +3,15 @@ package com.wj.sampleproject.activity
33
import android.content.Context
44
import android.os.Bundle
55
import cn.wj.android.base.ext.startTargetActivity
6+
import cn.wj.android.base.ext.string
67
import com.gyf.immersionbar.ImmersionBar
78
import com.tencent.mmkv.MMKV
89
import com.wj.sampleproject.R
910
import com.wj.sampleproject.base.ui.BaseActivity
1011
import com.wj.sampleproject.constants.*
1112
import com.wj.sampleproject.databinding.AppActivityMainBinding
13+
import com.wj.sampleproject.ext.toSnackbarModel
1214
import com.wj.sampleproject.fragment.*
13-
import com.wj.sampleproject.model.SnackbarModel
1415
import com.wj.sampleproject.simple.setFragmentAdapter
1516
import com.wj.sampleproject.viewmodel.MainViewModel
1617
import org.koin.androidx.viewmodel.ext.android.viewModel
@@ -47,14 +48,19 @@ class MainActivity
4748
}
4849
}
4950
}
51+
52+
// 配置 Snackbar 转换
53+
snackbarTransform = { snackbarModel ->
54+
snackbarModel.copy(targetId = R.id.cl_target)
55+
}
5056
}
5157

5258
override fun onBackPressed() {
5359
// 当前时间
5460
val currentBackPressMs = System.currentTimeMillis()
5561
if ((currentBackPressMs - lastBackPressMs).absoluteValue > MAIN_BACK_PRESS_INTERVAL_MS) {
5662
// 间隔时间外,提示
57-
viewModel.snackbarData.value = SnackbarModel(resId = R.string.app_press_again_to_exit, targetId = R.id.cl_target)
63+
viewModel.snackbarData.value = R.string.app_press_again_to_exit.string.toSnackbarModel()
5864
// 保存时间
5965
lastBackPressMs = currentBackPressMs
6066
} else {

app/src/main/kotlin/com/wj/sampleproject/base/ui/BaseActivity.kt

Lines changed: 18 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ import com.wj.android.ui.activity.BaseBindingLibActivity
1818
import com.wj.sampleproject.R
1919
import com.wj.sampleproject.base.viewmodel.BaseViewModel
2020
import com.wj.sampleproject.constants.ACTIVITY_ANIM_DURATION
21+
import com.wj.sampleproject.model.SnackbarModel
2122

2223
/**
2324
* Activity 基类
@@ -31,6 +32,9 @@ abstract class BaseActivity<VM : BaseViewModel, DB : ViewDataBinding>
3132
/** 侧滑返回帮助类对象 */
3233
private var mSwipeBackHelper: SwipeBackHelper? = null
3334

35+
/** Snackbar 转换接口 */
36+
protected var snackbarTransform: ((SnackbarModel) -> SnackbarModel)? = null
37+
3438
override fun onCreate(savedInstanceState: Bundle?) {
3539
beforeOnCreate()
3640
super.onCreate(savedInstanceState)
@@ -93,20 +97,24 @@ abstract class BaseActivity<VM : BaseViewModel, DB : ViewDataBinding>
9397
if (it.content.isNullOrBlank()) {
9498
return@Observer
9599
}
96-
val view = if (it.targetId == 0) {
100+
101+
// 转换处理
102+
val model = snackbarTransform?.invoke(it) ?: it
103+
104+
val view = if (model.targetId == 0) {
97105
mBinding.root
98106
} else {
99-
mBinding.root.findViewById(it.targetId)
107+
mBinding.root.findViewById(model.targetId)
100108
}
101-
val snackBar = Snackbar.make(view, it.content.orEmpty(), it.duration)
102-
snackBar.setTextColor(it.contentColor)
103-
snackBar.setBackgroundTint(it.contentBgColor)
104-
if (it.actionText != null && it.onAction != null) {
105-
snackBar.setAction(it.actionText, it.onAction)
106-
snackBar.setActionTextColor(it.actionColor)
109+
val snackBar = Snackbar.make(view, model.content.orEmpty(), model.duration)
110+
snackBar.setTextColor(model.contentColor)
111+
snackBar.setBackgroundTint(model.contentBgColor)
112+
if (model.actionText != null && model.onAction != null) {
113+
snackBar.setAction(model.actionText, model.onAction)
114+
snackBar.setActionTextColor(model.actionColor)
107115
}
108-
if (it.onCallback != null) {
109-
snackBar.addCallback(it.onCallback)
116+
if (model.onCallback != null) {
117+
snackBar.addCallback(model.onCallback)
110118
}
111119
snackBar.show()
112120
})

app/src/main/kotlin/com/wj/sampleproject/ext/Coroutines.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ import kotlinx.coroutines.withTimeout
1515
*/
1616

1717
/**
18-
* 在 [Dispatchers.IO] 线程执行 [block],超时时间为 [REQUEST_TIMEOUT]
18+
* 在 [Dispatchers.IO] 线程执行 [block] 进行网络请求,超时时间为 [REQUEST_TIMEOUT]
1919
*/
2020
suspend fun <T> netRequest(block: suspend CoroutineScope.() -> T): T {
2121
return withContext(Dispatchers.IO) {
Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
package com.wj.sampleproject.ext
2+
3+
import cn.wj.android.base.ext.string
4+
import cn.wj.android.base.utils.AppManager
5+
import com.google.android.material.snackbar.Snackbar
6+
import com.wj.sampleproject.R
7+
import com.wj.sampleproject.activity.LoginActivity
8+
import com.wj.sampleproject.base.ui.BaseActivity
9+
import com.wj.sampleproject.constants.NET_RESPONSE_CODE_LOGIN_FAILED
10+
import com.wj.sampleproject.constants.NET_RESPONSE_CODE_SUCCESS
11+
import com.wj.sampleproject.model.SnackbarModel
12+
import com.wj.sampleproject.net.NetResult
13+
14+
/**
15+
*
16+
* - 创建时间:2021/1/4
17+
*
18+
* @author 王杰
19+
*/
20+
21+
/**
22+
* 对返回数据进行判断,并处理相应逻辑
23+
* > 成功: [onSuccess] or 失败: [onFailed] or 登录失效: [onFailed4Login]
24+
*/
25+
inline fun <T> NetResult<T>.judge(
26+
crossinline onSuccess: NetResult<T>.() -> Unit = {},
27+
crossinline onFailed: NetResult<T>.() -> Unit = {},
28+
crossinline onFailed4Login: NetResult<T>.() -> Boolean = { false }
29+
) {
30+
when (errorCode) {
31+
NET_RESPONSE_CODE_SUCCESS -> {
32+
// 请求成功
33+
onSuccess.invoke(this)
34+
}
35+
NET_RESPONSE_CODE_LOGIN_FAILED -> {
36+
// 登录失效,需要重新登录
37+
if (onFailed4Login.invoke(this)) {
38+
// 已消费事件
39+
return
40+
}
41+
(AppManager.peekActivity() as? BaseActivity<*, *>)?.run {
42+
viewModel.snackbarData.value = SnackbarModel(
43+
content = errorMsg,
44+
duration = Snackbar.LENGTH_INDEFINITE,
45+
actionText = R.string.app_go_login.string,
46+
onAction = {
47+
// 登录失败,需要重新登录
48+
LoginActivity.actionStart(this)
49+
}
50+
)
51+
}
52+
}
53+
else -> {
54+
// 请求失败
55+
onFailed.invoke(this)
56+
}
57+
}
58+
}

app/src/main/kotlin/com/wj/sampleproject/ext/String.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,6 @@ package com.wj.sampleproject.ext
33
import com.wj.sampleproject.model.SnackbarModel
44

55
/** 根据 [String] 生成并返回 [SnackbarModel] */
6-
fun String?.toSnackbarMsg(): SnackbarModel {
6+
fun String?.toSnackbarModel(): SnackbarModel {
77
return SnackbarModel(this.orEmpty())
88
}

app/src/main/kotlin/com/wj/sampleproject/ext/Throwable.kt

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2,18 +2,13 @@ package com.wj.sampleproject.ext
22

33
import cn.wj.android.base.ext.string
44
import com.wj.sampleproject.R
5-
import com.wj.sampleproject.model.SnackbarModel
65
import java.net.ConnectException
76
import java.net.SocketTimeoutException
87

98
/** 异常对应的错误信息 */
10-
val Throwable.showMsg: String
9+
val Throwable.hintMsg: String
1110
get() = when (this) {
1211
is SocketTimeoutException -> R.string.app_net_error_timeout
1312
is ConnectException -> R.string.app_net_error_connect
1413
else -> R.string.app_net_error_failed
15-
}.string
16-
17-
/** 用于提示的错误信息 */
18-
val Throwable.snackbarMsg: SnackbarModel
19-
get() = showMsg.toSnackbarMsg()
14+
}.string

app/src/main/kotlin/com/wj/sampleproject/ext/Json.kt renamed to app/src/main/kotlin/com/wj/sampleproject/ext/Transform.kt

Lines changed: 26 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,24 @@
1-
@file:Suppress("unused")
2-
31
package com.wj.sampleproject.ext
42

53
import com.google.gson.Gson
64
import com.google.gson.reflect.TypeToken
75
import com.orhanobut.logger.Logger
6+
import com.wj.sampleproject.constants.NET_RESPONSE_CODE_ERROR
7+
import com.wj.sampleproject.model.SnackbarModel
8+
import com.wj.sampleproject.net.NetResult
89
import okhttp3.MediaType.Companion.toMediaTypeOrNull
910
import okhttp3.RequestBody
1011
import okhttp3.RequestBody.Companion.toRequestBody
1112
import org.json.JSONObject
1213

14+
/**
15+
* 数据转换相关
16+
*
17+
* - 创建时间:2020/12/31
18+
*
19+
* @author 王杰
20+
*/
21+
1322
/**
1423
* 将 [String] 转换为 [T] 类型数据对象并返回,可传参数 [gson]
1524
* > 转换失败返回 `null`
@@ -38,4 +47,19 @@ inline fun <reified T> T?.toJsonString(gson: Gson = Gson()): String {
3847
/** 将 [JSONObject] 转换为 [RequestBody] 并返回 */
3948
fun JSONObject.toJsonRequestBody(): RequestBody {
4049
return toString().toRequestBody("application/json; charset=utf-8".toMediaTypeOrNull())
50+
}
51+
52+
/** 将 [NetResult] 转换为对应 [SnackbarModel] */
53+
fun NetResult<*>.toSnackbarModel(): SnackbarModel {
54+
return SnackbarModel(errorMsg.orEmpty())
55+
}
56+
57+
/** 将 [Throwable] 转换为对应 [NetResult] */
58+
fun <E> Throwable.toNetResult(): NetResult<E> {
59+
return NetResult(errorCode = NET_RESPONSE_CODE_ERROR, errorMsg = hintMsg)
60+
}
61+
62+
/** 将 [Throwable] 转换为对应 [SnackbarModel] */
63+
fun Throwable.toSnackbarModel(): SnackbarModel {
64+
return SnackbarModel(hintMsg)
4165
}
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
package com.wj.sampleproject.ext
2+
3+
import com.wj.sampleproject.base.viewmodel.BaseViewModel
4+
import com.wj.sampleproject.net.NetResult
5+
6+
/**
7+
* ViewModel 相关
8+
*
9+
* - 创建时间:2020/12/31
10+
*
11+
* @author 王杰
12+
*/
13+
14+
/** 默认提示异常的方法块 */
15+
val BaseViewModel.defaultFaildBlock: NetResult<*>.() -> Unit
16+
get() = {
17+
snackbarData.value = toSnackbarModel()
18+
}

app/src/main/kotlin/com/wj/sampleproject/helper/UserInfoData.kt

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package com.wj.sampleproject.helper
22

33
import androidx.lifecycle.MutableLiveData
44
import com.tencent.mmkv.MMKV
5+
import com.wj.sampleproject.constants.SP_KEY_COOKIES
56
import com.wj.sampleproject.constants.SP_KEY_USER_INFO
67
import com.wj.sampleproject.entity.UserInfoEntity
78
import com.wj.sampleproject.ext.toJsonString
@@ -29,5 +30,9 @@ object UserInfoData : MutableLiveData<UserInfoEntity>() {
2930
override fun setValue(value: UserInfoEntity?) {
3031
super.setValue(value)
3132
MMKV.defaultMMKV().encode(SP_KEY_USER_INFO, value.toJsonString())
33+
if (null == value) {
34+
// 退出登录,清空 cookie
35+
MMKV.defaultMMKV().encode(SP_KEY_COOKIES, "")
36+
}
3237
}
3338
}

app/src/main/kotlin/com/wj/sampleproject/interfaces/ArticleCollectionInterface.kt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package com.wj.sampleproject.interfaces
22

3+
import com.wj.sampleproject.base.viewmodel.BaseViewModel
34
import com.wj.sampleproject.entity.ArticleEntity
45

56
/**
@@ -11,6 +12,8 @@ import com.wj.sampleproject.entity.ArticleEntity
1112
*/
1213
interface ArticleCollectionInterface {
1314

15+
var viewModel: BaseViewModel
16+
1417
/** 收藏文章[item] */
1518
fun collect(item: ArticleEntity)
1619

0 commit comments

Comments
 (0)