聊天对话框中,除了文字,一般还会有表情,图片,文件这些的显示。这些的处理都与文字的处理不一样。
1.表情的显示处理。
系统表情的话,一般都内置在程序中了,直接调用出来显示就可以了。自定义表情就跟图片的处理流程一样了。
eg:一个笑脸表情,发送者的程序里有这张图片,接收者的程序也有这张图片。那么这张图片就不需要通过文件传输发给接收者了,只需要发送一个标示过去告诉接收者这是哪一张系统表情图片就ok了。
我发了一个系统表情给你------》[笑脸]-----》接收到一个笑脸表情的标示----》在系统表情文件夹里找到笑脸图片-----》显示出来给你笑
2.图片的处理
图片的处理较之系统表情处理比较麻烦。发送者有这张图片,接收者不一定有这张图片。发送一个图片标示的做法是行不通了,必须将文件图片发给接收者才可以。
简单的解决方案:
我发了一张图片给你------》图片文件具体数据----》接收到一个文件{此次要检测文件是否传完}-----》显示出来???(你确定是图片,不是文件什么的)
改进a:
我发了一张图片给你-----》图片文件具体数据+[这是个图片]-----》接收到一个文件,标示为图片---》以图片的形式显示在对话框
ok,这样就差不多了。但是在实际操作中,图片的文件数据一般都比文字大得多,一张图片的大小甚至够你发一篇高考作文给对方了。
这样就有一个问题了,我发一张图片给你,耗时要10s(图片大,网络差),期间,我有发了些文字给你。结果:得等到图片完全接收完成才能显示出来后面的全部消息。如果一次性发送多张图,那你就等着哭吧。
改进b:
创建接收线程和聊天窗口线程分开,接收线程异步通知聊天窗口更新显示。创建文件接收线程用来接收文件。三个线程!!但是还是有问题:文字会先收到,图片后收到。
改进c:
采用(正在加载图片)先行占位,待图片传输完成替换掉。若传输失败(超时),用裂图替换掉。
嗯,差不多就这样了。文件的显示做法同图片。
实际操作中,采用单例模式定义一个用于接收图片的管理类。在三个线程中,要注意互斥问题。接收线程收到文件接收表示,启动文件接收线程去接收文件,并在管理类中压入该文件信息,文件传输完成要把管理类的文件状态置为已传输完成并通知聊天窗口显示。还有很多小细节问题,就不详细展开了。此次仅提供一个思路。