魅动力组件化方案

本质还是在一个app中处理,只不过通过gradle文件的配置达到了一种多模块和多lib的假象

这种方案的优势

  • 开发方便 页面跳转直接使用引用跳转
  • 模块的增加与删除无需syn gradle 直接编译即可生成,减少了同步编译的时间

劣势

  • 模块无法单独运行
  • 单模块无法单独添加依赖,依赖一旦添加,属于全局依赖

升级部分

  • RXBinding响应式编程替代code_edit.addTextChangedListener

优质库以及进步记录

  • BaseRecyclerViewAdapterHelper

https://github.com/CymChad/BaseRecyclerViewAdapterHelper

  • linearlayout 反向排列布局
1
2
3
4
5
6
7
8
<LinearLayout
android:id="@+id/live_bottom_layout"
android:layout_width="match_parent"
android:layout_height="50dp"
android:layout_alignParentBottom="true"
android:gravity="center_vertical"
android:layoutDirection="rtl"//这个反向
android:orientation="horizontal">
  • 性能和bug检测工具
1
2
debugImplementation 'com.didichuxing.doraemonkit:doraemonkit:2.0.2'//滴滴出品哆啦A梦
debugImplementation 'com.squareup.leakcanary:leakcanary-android:2.0-beta-5'//内存泄漏检测工具
  • 使用View.post更新UI或者测量控件宽高
1
2
3
4
5
6
live_room_bg_img.post {
/** 按照屏幕宽度调整视频高度 **/
live_room_bg_img.updateLayoutParams {
height = live_room_bg_img.measuredWidth * 1734 / 1080
}
}
  • let和also

let返回最后一行代码结果 also返回的是对象本身

业务代码总结

  • 第三方登录示例
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
private fun loginWechat() {
TdManager.performLogin(this, TdType.weixin, object : TdCallBack {
override fun onSuccess(success: BackResult) {
apiSpiceMgr.queryRegistered(success, success = { loginInfo ->
loginEnd(loginInfo)
}, failure = {
val msg = if (it.isNotEmpty()) it else "登录失败,请重试"
UIToast.toast(msg)
})
}

override fun onFailure(errResult: ErrResult) {
UIToast.toast(errResult.msg)
}
})
}
  • 吐司
1
UIToast.toast(this, getString(R.string.code_is_empty))
  • loading框
1
showLoading(true) 在父类MeiCustomBarActivity中有定义
  • 权限申请
1
2
3
4
5
RxPermissions(this)
.requestEachCombined(Manifest.permission.RECORD_AUDIO, Manifest.permission.CAMERA)
.subscribeBy {
Log.e("info", "上麦需要的权限: 录音,相机")
}
  • 创建对话框 用一个函数单独维护一个对话框对象 返回点击事件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
/**
* 选择需要开启的房间类型
*/
fun startLiveHintView(context: Context, back: (Int) -> Unit = {}): View = FrameLayout(context).apply {
layoutParams = ViewGroup.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT)
val content = LayoutInflater.from(context).inflate(R.layout.view_start_live_hint, this, false)
content.findViewById<View>(R.id.close_dialog_btn).setOnClickListener {
back(0)
}
content.findViewById<View>(R.id.submit_dialog_btn).setOnClickListener {
back(1)
}
addView(content)
}
0%