Modify: 基类进一步封装

This commit is contained in:
Quyunshuo
2020-08-28 16:02:58 +08:00
parent f9479e9242
commit 76d957cad8
17 changed files with 183 additions and 48 deletions

View File

@ -63,7 +63,7 @@ dependencies {
api GitHub.RetrofitConverterGson
api GitHub.Gson
api GitHub.MMKV
api GitHub.AutoSize
// api GitHub.AutoSize
api GitHub.Glide
api GitHub.ARoute
api GitHub.RecyclerViewAdapter

View File

@ -9,4 +9,8 @@ import android.app.Application
* @Remark: 自定义Application的基类
*/
open class BaseApplication : Application() {
override fun onCreate() {
super.onCreate()
}
}

View File

@ -0,0 +1,25 @@
package com.quyunshuo.base.mvvm.m
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.flow.FlowCollector
import kotlinx.coroutines.flow.flow
import kotlinx.coroutines.flow.flowOn
/**
* @Author: QuYunShuo
* @Time: 2020/8/27
* @Class: BaseRepository
* @Remark: 仓库层 Repository 基类
*/
open class BaseRepository {
/**
* 发起请求封装
* @param requestBlock 请求的整体逻辑
* @return Flow<T>
*/
protected suspend fun <T> flowRequest(requestBlock: suspend FlowCollector<T>.() -> Unit) =
flow {
requestBlock()
}.flowOn(Dispatchers.IO) // 通过 flowOn 切换到 io 线程
}

View File

@ -1,7 +1,9 @@
package com.quyunshuo.base.ui
package com.quyunshuo.base.mvvm.v
import android.os.Bundle
import androidx.appcompat.app.AppCompatActivity
import androidx.lifecycle.ViewModel
import androidx.lifecycle.ViewModelProvider
import androidx.viewbinding.ViewBinding
/**
@ -10,13 +12,17 @@ import androidx.viewbinding.ViewBinding
* @Class: BaseFrameActivity
* @Remark: Activity基类 与项目无关
*/
abstract class BaseFrameActivity<VB : ViewBinding> : AppCompatActivity() {
abstract class BaseFrameActivity<VB : ViewBinding, VM : ViewModel>(private val vmClass: Class<VM>) :
AppCompatActivity() {
lateinit var mBinding: VB
protected val mViewModel: VM by lazy(mode = LazyThreadSafetyMode.NONE) {
ViewModelProvider(this).get(vmClass)
}
protected val mBinding: VB by lazy(mode = LazyThreadSafetyMode.NONE) { initViewBinding() }
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
mBinding = initViewBinding()
setContentView(mBinding.root)
initView()
}

View File

@ -0,0 +1,43 @@
package com.quyunshuo.base.mvvm.v
import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.fragment.app.Fragment
import androidx.lifecycle.ViewModel
import androidx.lifecycle.ViewModelProvider
import androidx.viewbinding.ViewBinding
/**
* @Author: QuYunShuo
* @Time: 2020/8/27
* @Class: BaseFrameFragment
* @Remark: Fragment基类 与项目无关
*/
abstract class BaseFrameFragment<VB : ViewBinding, VM : ViewModel>(private val vmClass: Class<VM>) :
Fragment() {
protected val mViewModel: VM by lazy(mode = LazyThreadSafetyMode.NONE) {
ViewModelProvider(this).get(vmClass)
}
protected val mBinding: VB by lazy(mode = LazyThreadSafetyMode.NONE) { initViewBinding() }
protected abstract fun initViewBinding(): VB
protected abstract fun initView()
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
return mBinding.root
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
initView()
}
}

View File

@ -0,0 +1,17 @@
package com.quyunshuo.base.mvvm.vm
import androidx.lifecycle.ViewModel
import com.quyunshuo.base.mvvm.m.BaseRepository
/**
* @Author: QuYunShuo
* @Time: 2020/8/27
* @Class: BaseViewModel
* @Remark: ViewModel 基类
*/
abstract class BaseViewModel<R : BaseRepository> : ViewModel() {
protected val mRepository: R by lazy { initRepository() }
protected abstract fun initRepository(): R
}

View File

@ -1,12 +0,0 @@
package com.quyunshuo.base.ui
import androidx.fragment.app.Fragment
/**
* @Author: QuYunShuo
* @Time: 2020/8/27
* @Class: BaseFrameFragment
* @Remark: Fragment基类 与项目无关
*/
abstract class BaseFrameFragment : Fragment() {
}

View File

@ -1,10 +0,0 @@
package com.quyunshuo.base.ui
/**
* @Author: QuYunShuo
* @Time: 2020/8/27
* @Class: BaseRepository
* @Remark: 仓库层 Repository 基类
*/
open class BaseRepository {
}

View File

@ -1,12 +0,0 @@
package com.quyunshuo.base.ui
import androidx.lifecycle.ViewModel
/**
* @Author: QuYunShuo
* @Time: 2020/8/27
* @Class: BaseViewModel
* @Remark: ViewModel 基类
*/
open class BaseViewModel : ViewModel() {
}

View File

@ -1,7 +1,7 @@
<resources>
<!-- Base application theme. -->
<style name="base_AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
<style name="base_AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
<!-- Customize your theme here. -->
<item name="colorPrimary">@color/base_colorPrimary</item>
<item name="colorPrimaryDark">@color/base_colorPrimaryDark</item>

View File

@ -1,7 +1,8 @@
package com.quyunshuo.common.ui
import androidx.lifecycle.ViewModel
import androidx.viewbinding.ViewBinding
import com.quyunshuo.base.ui.BaseFrameActivity
import com.quyunshuo.base.mvvm.v.BaseFrameActivity
/**
* @Author: QuYunShuo
@ -9,4 +10,5 @@ import com.quyunshuo.base.ui.BaseFrameActivity
* @Class: BaseActivity
* @Remark: 项目相关的Activity基类
*/
abstract class BaseActivity<VB : ViewBinding> : BaseFrameActivity<VB>()
abstract class BaseActivity<VB : ViewBinding, VM : ViewModel>(vmClass: Class<VM>) :
BaseFrameActivity<VB, VM>(vmClass)

View File

@ -1,6 +1,8 @@
package com.quyunshuo.common.ui
import androidx.fragment.app.Fragment
import androidx.lifecycle.ViewModel
import androidx.viewbinding.ViewBinding
import com.quyunshuo.base.mvvm.v.BaseFrameFragment
/**
* @Author: QuYunShuo
@ -8,5 +10,5 @@ import androidx.fragment.app.Fragment
* @Class: BaseFragment
* @Remark: 项目相关的Fragment基类
*/
abstract class BaseFragment : Fragment() {
}
abstract class BaseFragment<VB : ViewBinding, VM : ViewModel>(vmClass: Class<VM>) :
BaseFrameFragment<VB, VM>(vmClass)

View File

@ -1,5 +1,6 @@
package com.quyunshuo.main
import android.widget.Toast
import com.quyunshuo.common.ui.BaseActivity
import com.quyunshuo.main.databinding.MainActivityMainBinding
@ -9,12 +10,17 @@ import com.quyunshuo.main.databinding.MainActivityMainBinding
* @Class: MainActivity
* @Remark: 主界面Activity
*/
class MainActivity : BaseActivity<MainActivityMainBinding>() {
class MainActivity :
BaseActivity<MainActivityMainBinding, MainViewModel>(MainViewModel::class.java) {
override fun initViewBinding(): MainActivityMainBinding =
MainActivityMainBinding.inflate(layoutInflater)
override fun initView() {
mBinding.mTv.text = "Hello MVVM"
mViewModel.msg.observe(this, {
mBinding.mTv.text = it
Toast.makeText(this, it, Toast.LENGTH_SHORT).show()
})
mBinding.mBtn.setOnClickListener { mViewModel.getString() }
}
}

View File

@ -0,0 +1,20 @@
package com.quyunshuo.main
import com.quyunshuo.base.mvvm.m.BaseRepository
/**
* @Author: QuYunShuo
* @Time: 2020/8/28
* @Class: MainRepository
* @Remark:
*/
class MainRepository : BaseRepository() {
/**
* 模拟请求或读取数据库
*/
suspend fun getString() =
flowRequest<String> {
emit("嘿嘿")
}
}

View File

@ -0,0 +1,29 @@
package com.quyunshuo.main
import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.viewModelScope
import com.quyunshuo.base.mvvm.vm.BaseViewModel
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.flow.collectLatest
import kotlinx.coroutines.launch
/**
* @Author: QuYunShuo
* @Time: 2020/8/28
* @Class: MainViewModel
* @Remark:
*/
class MainViewModel : BaseViewModel<MainRepository>() {
val msg: MutableLiveData<String> = MutableLiveData<String>()
override fun initRepository(): MainRepository = MainRepository()
fun getString() {
viewModelScope.launch(Dispatchers.IO) {
mRepository.getString().collectLatest {
msg.postValue(it)
}
}
}
}

View File

@ -15,4 +15,13 @@
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<Button
android:id="@+id/mBtn"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="获取值"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/mTv" />
</androidx.constraintlayout.widget.ConstraintLayout>

View File

@ -1,2 +1,8 @@
# Android项目框架(组件化 + Kotlin + MVVM + Jetpack )
note: 1. 测试打包脚本
协程相关{
Activity/Fragment 中 可以使用 lifecycleScope,与Activity/Fragment绑定了生命周期 无需手动取消
ViewModel 中 可以使用 viewModelScope,它与ViewModel绑定了生命周期 无需手动取消
lifecycleScope和viewModelScope 默认的调度器是Main
}