- v3.0.0:(2024年02月06日)
- 增加Hilt组件支持
- 代码优化
allprojects {
repositories {
maven { url 'https://jitpack.io' }
}
}
Step 2. Add the dependency
dependencies {
implementation 'com.github.cl-6666:mvvm-framework:v3.0.0'
}
Step 3. Add hilt
plugins {
id 'com.google.dagger.hilt.android'
id 'kotlin-kapt'
}
//hilt官方地址:https://developer.android.google.cn/training/dependency-injection/hilt-android?hl=zh-cn
def hilt_version = "2.48.1"
api "com.google.dagger:hilt-android:$hilt_version"
kapt "com.google.dagger:hilt-android-compiler:$hilt_version"
基本使用和2.+版本一样,具体可以参考2.+版本,不一样的地方3.+版本引入了hilt组件,hlt组件可以做很多事情,具体可以根据项目情况修改,以下是一个简单案例
所有使用 Hilt 的应用都必须包含一个带有 @HiltAndroidApp 注解的 Application 类。
@HiltAndroidApp
class ExampleApplication : Application() { ... }
生成的这一 Hilt 组件会附加到 Application 对象的生命周期,并为其提供依赖项。此外,它也是应用的父组件,这意味着,其他组件可以访问它提供的依赖项。
在 Application 类中设置了 Hilt 且有了应用级组件后,Hilt 可以为带有 @AndroidEntryPoint 注解的其他 Android 类提供依赖项:
@AndroidEntryPoint
class ExampleActivity : AppCompatActivity() { ... }
Hilt 会按照相应 Android 类的生命周期自动创建和销毁生成的组件类的实例。
生成的组件 | 创建时机 | 销毁时机 |
---|---|---|
SingletonComponent | Application#onCreate() | Application 已销毁 |
ActivityRetainedComponent | Activity#onCreate() | Activity#onDestroy() |
ViewModelComponent | ViewModel 已创建 | ViewModel 已销毁 |
ActivityComponent | Activity#onCreate() | Activity#onDestroy() |
FragmentComponent | Fragment#onAttach() | Fragment#onDestroy() |
ViewComponent | View#super() | View 已销毁 |
ViewWithFragmentComponent | View#super() | View 已销毁 |
ServiceComponent | Service#onCreate() | Service#onDestroy() |
- Kotlin
- Jetpack
- Lifecycle: 观察 Android 生命周期并根据生命周期变化处理 UI 状态
- ViewModel: 管理与 UI 相关的数据持有者和生命周期感知。 允许数据在配置更改(例如屏幕旋转)中保存下来。
- ViewBinding: 使用声明性格式而不是以编程方式将布局中的 UI 组件绑定到应用程序中的数据源。
- Room: 通过在 SQLite 上提供抽象层来构建数据库,以允许流畅的数据库访问。
- Hilt: 用于依赖注入。
- LiveData
- ksp: Kotlin 符号处理 API。
- Glide, GlidePalette: 从网络加载图像。
- Timber: 日志框架
- OkHttp:网络请求
- PersistentCookieJar:持久CookieJar实现
- logging-interceptor:网络日志
- Retrofit:网络请求
@Module
@InstallIn(SingletonComponent::class)
object NetworkModule : BaseNetworkApi(){
/**
* 实现重写父类的setHttpClientBuilder方法,
* 在这里可以添加拦截器,可以对 OkHttpClient.Builder 做任意操作
*/
override fun setHttpClientBuilder(builder: OkHttpClient.Builder): OkHttpClient.Builder {
//普通网络日志显示写法
val httpLoggingInterceptor = HttpLoggingInterceptor { message ->
Timber.i(
"网络日志", message
)
}
httpLoggingInterceptor.level = HttpLoggingInterceptor.Level.BODY
//框架内部封装日志显示写法 hideVerticalLine = true代表隐藏横线
val loggingInterceptor = AndroidLoggingInterceptor.build(hideVerticalLine = true)
builder.apply {
/** 设置缓存配置 缓存最大10M */
cache(Cache(File(appContext.cacheDir, "cxk_cache"), 10 * 1024 * 1024))
/** 添加Cookies自动持久化 */
// cookieJar(cookieJar)
/** 演示添加缓存拦截器 可传入缓存天数,不传默认7天 */
addInterceptor(CacheInterceptor())
/** 演示添加公共heads 注意要设置在日志拦截器之前,不然Log中会不显示head信息 */
addInterceptor(MyHeadInterceptor())
/** 演示添加缓存拦截器 可传入缓存天数,不传默认7天 */
addInterceptor(CacheInterceptor())
/** 演示token过期拦截器演示 */
addInterceptor(TokenOutInterceptor())
/** 演示日志拦截器 */
addInterceptor(loggingInterceptor)
/** 超时时间 连接、读、写 */
connectTimeout(10, TimeUnit.SECONDS)
readTimeout(5, TimeUnit.SECONDS)
writeTimeout(5, TimeUnit.SECONDS)
}
return builder
}
/**
* 实现重写父类的setRetrofitBuilder方法,
* 在这里可以对Retrofit.Builder做任意操作,比如添加GSON解析器,protobuf等
*/
override fun setRetrofitBuilder(builder: Retrofit.Builder): Retrofit.Builder {
return builder.apply {
addConverterFactory(GsonConverterFactory.create(GsonBuilder().create()))
}
}
@Provides
fun provideApiService(): ApiService {
return NetworkModule.getApi(ApiService::class.java, Constants.BASE_URL, false)
}
}
在ViewModel里面使用介绍
@HiltViewModel
class MainViewModel @Inject constructor(
private val apiService: ApiService
): BaseViewModel() {
private var articleListData: MutableLiveData<Data> = MutableLiveData()
/**
* 网络请求
*/
fun apiArticleListData() {
request({ apiService.getEntryAndExitData()},{
articleListData.value=it
},{
//失败
},true)
}
/**
* 获取数据
*/
fun getArticleListData(): MutableLiveData<Data> {
return articleListData
}
}
HomeFragment相关代码
@AndroidEntryPoint
class HomeFragment : BaseFragment<FragmentHomeBinding>(){
private val mViewModel: MainViewModel by viewModels()
private val mArticleListAdapter: ArticleListAdapter by lazy { ArticleListAdapter(arrayListOf()) }
override fun initView(savedInstanceState: Bundle?) {
mViewModel.apiArticleListData()
mDatabind.rvArticleList.init(LinearLayoutManager(activity), mArticleListAdapter, false)
mViewModel.getArticleListData().observe(this) {
mArticleListAdapter.submitList(it.datas)
}
}
}
- 当gradle-7.0以上,部分设备glide加载不出图片解决方法
<application
........
android:requestLegacyExternalStorage="true"
........
>
博客地址:https://blog.csdn.net/a214024475/article/details/130625856?spm=1001.2014.3001.5501