一、实现原理
使用Retrofit实现网络请求,在通过Rxjava2实现线程调度,通过Gson得到当前的需要的模型类
二、实现过程
1、添加依赖
implementation 'com.squareup.okhttp3:okhttp:3.12.3' // OkHttp3
implementation 'com.squareup.okhttp3:logging-interceptor:3.10.0' // 日志
implementation 'com.squareup.retrofit2:retrofit:2.6.0' // Retrofit2
implementation 'com.squareup.retrofit2:adapter-rxjava2:2.6.0' // Retrofit2 -> RxJava 的适配
implementation 'com.squareup.retrofit2:converter-gson:2.5.0' // Gson转换器
implementation 'com.squareup.retrofit2:converter-scalars:2.4.0' // 响应转为基本类型所需依赖
// LeakCanary 内存泄漏检测工具
debugImplementation 'com.squareup.leakcanary:leakcanary-android:1.6.3'
releaseImplementation 'com.squareup.leakcanary:leakcanary-android-no-op:1.6.3'
debugImplementation 'com.squareup.leakcanary:leakcanary-support-fragment:1.6.3'
// RxJava
implementation 'io.reactivex.rxjava2:rxjava:2.2.6'
implementation 'io.reactivex.rxjava2:rxandroid:2.1.0'
// 处理网络请求可能导致的内存泄漏
implementation 'com.trello.rxlifecycle2:rxlifecycle-components:2.1.0'
2、添加对应的权限
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
3、创建对应的基础类目录
三、实现
1、因为使用了RxJava2所以需要使用Rxlifecycle防止内存泄露
2、实现Activity和Fragment的基类,并根据自己的需要做简单的封装
abstract class BasicActivity : RxFragmentActivity() {
protected abstract val mLayoutResId: Int
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
if (this.mLayoutResId > 0) {
setContentView(mLayoutResId)
} else {
throw RuntimeException("this activity is miss cotentview")
}
onContentViewReady(savedInstanceState)
}
abstract fun onContentViewReady(savedInstanceState: Bundle?)
fun <A> startActivity(clazz: Class<A>, data: Bundle?) {
var intent = Intent(this, clazz)
data?.let { intent.putExtras(data) }
this.startActivity(intent)
}
fun <A> startActivity(clazz: Class<A>) {
var intent = Intent(this, clazz)
this.startActivity(intent)
}
}
abstract class BasicFragment : Fragment(), LifecycleProvider<FragmentEvent> {
private val lifecycleSubject = BehaviorSubject.create<FragmentEvent>()
protected abstract val mLayoutResId: Int
protected var mRootView: View? = null
override fun lifecycle(): Observable<FragmentEvent> {
return this.lifecycleSubject.hide()
}
/**
* 指定生命周期断开
*/
override fun <T : Any?> bindUntilEvent(event: FragmentEvent): Lifecycl