# KotlinWebSocketIM **Repository Path**: me_angle/KotlinWebSocketIM ## Basic Information - **Project Name**: KotlinWebSocketIM - **Description**: Kotlin应用开发之WebSocket IM 聊天室! - **Primary Language**: Kotlin - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 1 - **Created**: 2026-04-18 - **Last Updated**: 2026-04-18 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # KotlinWebSocketIM #### 介绍 Kotlin应用开发之WebSocket IM 聊天室! #### 软件架构 软件说明 转载借鉴,请标明来源,并附上链接。谢谢! 1.Kotlin语法应用。 2.通过Service启动WebSocket 3.通过广播BroadcastReceiver与Activity通信,采用的是静态广播,所以8.0系统以后静态广播无法通过接口Callback 回调到Activity,我用的是静态Handler来实现的。 当然,你可以将自己集成BroadcastReceiver的类写到Activity中也可以直接在onReceive()中操作UI,但是这不是我的风格。 还有,你可以采用动态注册的广播直接操作就能拿到广播对象进行操作UI。 4.Adapter 的 ViewHolder 优化: 在Kotlin中的ViewHolder 写法: inner class MViewHolder(itemView: View) : RecyclerView.ViewHolder(view) 在onBindViewHolder中: holder.itemView.tvName.text = $mName 错误:这种写法这里ViewHolder中没有进行任何控件声明,相当于只是定义了一个空的ViewHolder。然后在onBindViewHolder()函数当中, 直接调用holder.itemView再接上控件id的名称就可以使用了。 这种写法经过反编译后发现;其实它是把findViewById()写在了onBindViewHolder()中,这样就导致ViewHolder的作用完全失效了。 正确:如何正确的在Adapter中使用ViewHolder,将Kotlin-Android-Extensions在Activity、Fragment中的使用转换为Java代码, 发现实质上是创建了一个HashMap来存储和提取已经实例化的控件,避免多次调用findViewById() 。 A。那么在ViewHolder中,我们也使用HashMap来缓存控件实例。首先在build.gradle中启用实验模式: //打开实验性功能 (主要是为了启用LayoutContainer) androidExtensions { experimental = true } B。//实现LayoutContainer接口 inner class MViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView), LayoutContainer { override val containerView: View = this.itemView } 而后在onBindViewHolder()中,通过 holder.tvName.text = "Yx" 来设置参数(这里通过holder打点直接调用控件ID就可以, 初次调用findViewById()之后会缓存进HashMap里) 接入LayoutContainer来实现,这样会有更好的性能表现。 ————————————YX————————————