Kotlin初体验:IM项目体验

个人博客地址: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? = 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 = 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

你可能感兴趣的:(Kotlin初体验:IM项目体验)