- view
- presenter
- model
持有顺序:UI -> interface view -> presenter -> model 回调顺序:model -> presenter -> interface view callback -> UI
- BaseModel
interface IBaseModel<B> {
fun fetch(listener: LoadListener)
interface LoadListener {
fun onComplete(bean: B)
fun onError(msg: String)
}
}
- BaseView
interface IBaseView {
fun showError()
// ...
}
- BasePresenter
- 弱引用根除Activity内存泄漏问题
- 使用Lifecycle感知生命周期
protected class BasePresenter<V : BaseView> : LifecycleObserver {
val iView: WeakReference<V>? = null
fun attachView(v: V) {}
fun detachView() {}
}
- BaseActivity
- 利用attachView()连接Presenter和View
protected abstract class BaseActivity<P : BasePresenter<V>, V : IBaseView> : AppCompactActivity() {
abstract fun createPresenter(): P
protected lateinit var presenter: P
override fun onCreate(savedInstanceState: Bundle?) {
this.presenter = createPresenter()
this.presenter.attachView(this as V)
}
}
- 被观察者:实现LifecycleOwner
- Activity、Fragment
- 观察者:继承LifecycleObserver
- 各种Presenter
技术研究向复杂版,轻量级别无视,或者使用android-startup
算法实现
TopologySort.kt
单元测试
TopologySortTest.kt
===== 拓扑排序结果 ====
SafetyCheckTask =>PrivacyTask =>DataBaseTask =>SDKTask =>MiddlewareTask
===== 拓扑依赖关系图 ====
PrivacyTask <= DataBaseTask, SDKTask,
SDKTask <= MiddlewareTask,
DataBaseTask <= MiddlewareTask,
SafetyCheckTask <= PrivacyTask,
接口
Dispatcher.kt
- 提供运行线程选择
- 提供线程池选择
- 支持设置线程优先级
默认实现
抽象类AndroidStartup.kt
持有一个CountDownLatch对象
线程池管理
ExecutorManager.kt
提供三种线程池
- cpu密集型
- io密集型
- main主线程
线程任务封装
StartupRunnable.kt
启动入口
StartupManager.kt
遗留问题:countDownLatch初始化和赋值
优化结果 只需要在manifest中配置末端任务,程序会自动查找父任务依次执行
StartupProvider.kt
- 在Application#onCreate()之前执行
StartupInitializer.kt
- PMS 读取Provider#META-DATA
- 递归遍历父任务
/common/LiveDataBus.kt
Koin
/common/hook/HookUtil.kt
/kotlin_plugin/CustomKotlinPlugin
Tombstone 文件默认将被写入到 Context#getFilesDir() + "/tombstones" 目录。(通常在: /data/data/PACKAGE_NAME/files/tombstones)
处理思路:
- app启动后10秒,开始逐个上传tombstones目录下的崩溃文件,上传成功一个删除一个。
- app启动后10秒内发生的崩溃,在callback中立刻尝试投递,投递成功则删除。