IM 小项目总结

参考文章

[023]你真的懂AIDL的oneway嘛?
系统“内存重启”后,Activity和Fragment的生命周期浅谈
FragmentActivity重启时Fragment状态异常的问题解决办法

概述

此偏是我做了一个小型的IM的一个总结,采用到的思想,遇到的问题分享给大家

采用过的通信方案

1、多进程方式,通过Messenger多进程通信,这种模式是属于队列模式。
我目前感受到的缺点

  • 一次只能处理一次请求,对于高频率的聊天不适合
  • 无法通过直接调用方法名称的方式来处理,你只能通过判断message.what的方式

2、多进程方式,Aidl多进程通信,可以通过调用方法名称的方式,可以异步进行回调(采用 oneway)
我目前采用的是第二种方案

遇到的问题

1、A 进程与B进程通信,如果传输量大(可以传输的大小,1M-8KB,如果aidl是oneway 还得可以传输的大小还得/2),会直接 android.os.TransactionTooLargeException 。
我目前的处理是,如果传输的量 > 200k 就将数据存储到本地,然后发送一个刚刚存储数据的唯一ID,给另外一个进程,进行本地数据库查询获取数据。

2、 既然是聊天,那就会设计到与服务器的通信,有采用过socket,但是这玩意会存在黏包现象发生,后面就采用okhttp的webscoket,这玩意就没有出现过黏包现象,不知道是否跟html的一样,遵循了RFC规范所以就不会这产生这种现象。我采用的轮子RxWebSocket,但是它这个我在测试的时候发现一个问题,我跟服务器之间断开连接后,想再次连接就无法连接上,它是通过一个map的方式,将url作为key,websocket作为value的方式,也就是他可以处理多个websocket。由于我项目只有一个websocket,所以我讲map的方式进行移除了,这里是我修改后的地址 在这里你完全可以摒弃我主demo的东西,和 WebSocket --- components 包里面的东西

你可能感兴趣的:(IM 小项目总结)