【多线程编程】模拟QQ的“正在输入...”,输入状态检测原理
2015-11-28 17:44
543 查看
如果留意的话,你会发现新版本的QQ、微信、易信都增加了一个输入状态检测的新功能,来提醒你聊天的对方当前是否正在编辑信息。这次在从西安回来的路上,我一直在思考这个东西的原理,到实验室后赶紧做了一些实验,也达到了类似的效果。下图是我QQ上的效果图。
![](http://img.blog.csdn.net/20151128170357404?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
那么它的原理是什么呢?
首先要用到多线程,即需要一个线程去不断检测文本输入框的字符串长度,当输入字符长度在变化时就认为有操作,即“正在输入”。那这就简单了,此时自己的QQ客户端只需将一个boolean型的值通过网络,如http或socket等方式后台传给对方QQ客户端,则对方QQ就会提醒你“正在输入...”。
原理想通后就动手做吧,下面是我写的一段程序,注释比较详细,不多赘述。先来看下运行结果。
![](http://img.blog.csdn.net/20151128172003620?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
注:连续输入c216 linux,则一直提示“正在输入...”。
![](http://img.blog.csdn.net/20151128172150572?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
注:输入结束后,或中间停止输入,则不再提示。
目前,检查间隔sleep设为500ms,正常速度输入时,效果较好。可以自己体验哦!下面是完整代码。
![](http://img.blog.csdn.net/20151128172819576?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
欢迎大家进一步交流、改进!Q:316190672,兰州理工大学,郭立。
那么它的原理是什么呢?
首先要用到多线程,即需要一个线程去不断检测文本输入框的字符串长度,当输入字符长度在变化时就认为有操作,即“正在输入”。那这就简单了,此时自己的QQ客户端只需将一个boolean型的值通过网络,如http或socket等方式后台传给对方QQ客户端,则对方QQ就会提醒你“正在输入...”。
原理想通后就动手做吧,下面是我写的一段程序,注释比较详细,不多赘述。先来看下运行结果。
注:连续输入c216 linux,则一直提示“正在输入...”。
注:输入结束后,或中间停止输入,则不再提示。
目前,检查间隔sleep设为500ms,正常速度输入时,效果较好。可以自己体验哦!下面是完整代码。
package XiaoMi; import java.awt.Button; import java.awt.FlowLayout; import java.awt.Frame; import java.awt.Label; import java.awt.Panel; import java.awt.TextField; public class test27 extends Frame { /** * @param args */ MyTextField myTextField = new MyTextField(); public test27(String title) { super(title); Panel disp = new Panel(); disp.setLayout(new FlowLayout()); //设置布局类型 disp.add(myTextField); new Thread(myTextField).start(); //开启输入检测线程 add("West", disp); Label info = new Label(""); //添加提示标签控件 add("Center", info); Button control = new Button("发送"); //添加按钮控件 add("South", control); pack(); //调整窗口的大小 setVisible(true); //设置可见性 while (true) { //循环检测输入并提示 if (myTextField.isInputing) info.setText("正在输入..."); else info.setText(""); } } public static void main(String[] args) { // TODO Auto-generated method stub new test27("模拟QQ检测输入程序"); } } // 定义具有输入检测功能的TextField class MyTextField extends TextField implements Runnable { boolean isInputing = false; //是否正在输入 public MyTextField() { super(""); //文本框默认显示值 } @Override public void run() { // TODO Auto-generated method stub while (true) { int strLengthBefore = this.getText().length(); //获取休眠前输入字符串长度 try { Thread.sleep(500); //调节检测的周期,即灵敏度 } catch (InterruptedException e) { } int strLengthAfter = this.getText().length(); //获取休眠后输入字符串长度 if (strLengthAfter != strLengthBefore) isInputing = true; else isInputing = false; // System.out.println("当前字符长度: " + strLengthAfter); //后台输出 if (isInputing) System.out.println("正在输入..."); } } }最后,贴上调试时的后台输入,帮助理解!(输入1~9,中间非连续速度输入。)【多线程文章可参考:guomutian911】
欢迎大家进一步交流、改进!Q:316190672,兰州理工大学,郭立。
相关文章推荐
- C++ const
- 新测 thinkphp3.2 整合 PHPMailer 发送邮件
- Delphi 7下使用VT实现树型列表结合控件
- delphi 获取颜色值的RGB
- java 集合 有一个字符串,其中包含中文字符、英文字符和数字字符,请统计和打印出各个字符的个数
- Spring 的扩展机制测试
- hibernate继承关系映射方法(三)--每个具体类一张表TPC
- 夯实JAVA基本之二 —— 反射(2):泛型相关周边信息获取
- java 集合 从类似如下的文本文件中读取出所有的姓名,并打印出重复的 * 姓名和重复的次数,并按重复次数排序:
- c++ primer 11 泛型算法
- c++ primer 10 关联容器
- C++实现 搜狗实验室新闻语料抽取
- 如何加快Eclipse的启动速度?
- c++ primer 9 顺序容器
- 关于C++中结构体及其指针成员的内存分配和释放
- c++ primer 8 标准IO库
- Asp.Net MVC 教程汇总
- eclipse不能修改dynamic web module version的解决办法
- c++ primer 7 函数
- 3D引擎:Horde3D:Shader类里的 结构体,以及渲染一个 Logo的简单流程(三)