个人博客地址:https://blog.yookingh.cn
该文章地址:https://blog.yookingh.cn/dev/190809-kotlin-IM.html
配合食用文章:Kotlin-webSocket的基本封装
简书地址:Kotlin-webSocket的基本封装
项目
基于 Kotlin 和 AndroidX 及 WebSocket 的 IM 项目
本文主要以一个小Demo来初步了解Kotlin编程与Java编程的差异
项目构建
聊天窗口构建
框架引入:BRVAH官网
implementation 'androidx.recyclerview:recyclerview:1.1.0-beta02'//AndroidX RecyclerView
implementation 'com.github.CymChad:BaseRecyclerViewAdapterHelper:2.9.46'//BRVAH
new 对象
在Kotlin中,new Object();
省略为Object()
,也不需要分号
全局变量
private lateinit var mContext: Context
全局变量应该用var来定义,其类型写在:之后
lateinit 修饰符:延迟初始化
lateinit 不能用来修饰基本数据类型,因为基本类型的属性在类加载后的准备阶段都会被初始化为默认值
lateinit var a : Int
//'lateinit' modifier is not allowed on properties of primitive types
lateinit 不能修饰val变量,只能修饰可变的属性
private lateinit val etMessage : AppCompatEditText
//'lateinit' modifier is allowed only on mutable properties
静态全局变量
companion object {
//ChatActivity.class.getName()的写法
//const 是常量修饰词 类似 java 中的 static final
//val 相当于 final
//const 不能修饰 var
const val TAG: String = ChatActivity::class.java.name
}
符号
helper!!
意为:helper不做为空校验,如果为空则抛出异常
// ? 即 或许为空
// ?. 相当于 if(object == null) return null; else return objcet.xx;
val mList: ArrayList<String>? = null//如果Object后面不加问号,即Object?那么mList = null会报错
Log.d(TAG, "ListSize = ${mList?.size}")//用 mList!!.size 会抛出空指针异常
Log日志:com.yooking.socket.ChatActivity: ListSize = null
构建javabean
class ChatData(private val type: Int) : MultiItemEntity {
var name: String? = ""
}
//对应的java写法
class ChatData extends MultiItemEntity{
private int type;
private String name = "";
public ChatData(int type){
this.type = type;
}
public void setName(String name){
this.name = name;
}
public String getName(){
return this.name;
}
}
//在Kotlin中 get 方法 的使用方法为 chatData.name
//在Kotlin中 set 方法 的使用方法为 chatData.name = "string"
WebSocketLib构建
框架引入:OkHttp-GithubPage
api 'com.squareup.okhttp3:okhttp:4.0.1'//okhttp 4.0.1
//api 'com.squareup.okhttp3:mockwebserver:4.0.1'//okhttp moc 请求验证
api 'com.squareup.okhttp3:logging-interceptor:4.0.1'//okhttp 请求日志
匿名内部类
在kotlin中,匿名内部类和java中的差别不大
private var handler: Handler
init{
handler = Handler {//it:Messag!
send(heartMessage)
it.target.sendEmptyMessageDelayed(WHAT_HEART, heartTime)
}
}
//java
handler = new Handler(){
@override
public void handlerMessage(Message msg){
super.handleMessage(msg);
send(heartMessage);
sendEmptyMessageDelayed(WHAT_HEART, heartTime);
}
}
静态内部类
由于handler调用外部方法容易造成内存泄漏,所以,静态内部类了解一下:
companion object {
private class WithoutLeakHandler(wsu:WebSocketUtils):Handler(){
private val mWsu:WeakReference<WebSocketUtils> = WeakReference(wsu)
override fun handleMessage(msg: Message?) {
super.handleMessage(msg)
val webSocketUtils = mWsu.get()!!
webSocketUtils.send(webSocketUtils.heartMessage)
msg!!.target.sendEmptyMessageDelayed(WHAT_HEART, webSocketUtils.heartTime)
}
}
}
具体实现请见Demo
聊天代码:Demo