android websocket封装,Android WebSocket 方案选型OkHttp

目前Android WebSocket 框架 主要包括:

SocketIO

Java-WebSocket

OkHttp WebSocket

一开始我首选的是采用SocketIO方案,因为考虑该方案封装接口好,提供异步回调机制,但和后端同事沟通发现目前客户端的SocketIO不支持ws wss协议, 所以无奈只能放弃。

接着考虑采用Java-WebSocket方案,该方案是websocket的java完整实现,目前github6.5K星,于是考虑导入,但是在实测时发现调用connect,reConnect,如果导致线程异常报错,网上搜索相关解决方案,并不能有效解决此问题,当然也可能是我没有更深入分析此问题。

最后考虑采用OkHttp方案,基于OkHttp优秀的线程读写控制机制,发现该方案出奇的稳定。

public class WebSocketHandler extends WebSocketListener {

private static final String TAG = "WebSocketHandler ";

private String wsUrl;

private WebSocket webSocket;

private ConnectStatus status;

private OkHttpClient client = new OkHttpClient.Builder()

.build();

private WebSocketHandler(String wsUrl) {

this.wsUrl = wsUrl;

}

private static WebSocketHandler INST;

public static WebSocketHandler getInstance(String url) {

if (INST == null) {

synchronized (WebSocketHandler.class) {

INST = new WebSocketHandler(url);

}

}

return INST;

}

public ConnectStatus getStatus() {

return status;

}

public void connect() {

//构造request对象

Request request = new Request.Builder()

.url(wsUrl)

.build();

webSocket = client.newWebSocket(request, this);

status = ConnectStatus.Connecting;

}

public void reConnect() {

if (webSocket != null) {

webSocket = client.newWebSocket(webSocket.request(), this);

}

}

public void send(String text) {

if (webSocket != null) {

log("send: " + text);

webSocket.send(text);

}

}

public void cancel() {

if (webSocket != null) {

webSocket.cancel();

}

}

public void close() {

if (webSocket != null) {

webSocket.close(1000, null);

}

}

@Override

public void onOpen(WebSocket webSocket, Response response) {

super.onOpen(webSocket, response);

log("onOpen");

this.status = ConnectStatus.Open;

if (mSocketIOCallBack != null) {

mSocketIOCallBack.onOpen();

}

}

@Override

public void onMessage(WebSocket webSocket, String text) {

super.onMessage(webSocket, text);

log("onMessage: " + text);

if (mSocketIOCallBack != null) {

mSocketIOCallBack.onMessage(text);

}

}

@Override

public void onMessage(WebSocket webSocket, ByteString bytes) {

super.onMessage(webSocket, bytes);

}

@Override

public void onClosing(WebSocket webSocket, int code, String reason) {

super.onClosing(webSocket, code, reason);

this.status = ConnectStatus.Closing;

log("onClosing");

}

@Override

public void onClosed(WebSocket webSocket, int code, String reason) {

super.onClosed(webSocket, code, reason);

log("onClosed");

this.status = ConnectStatus.Closed;

if (mSocketIOCallBack != null) {

mSocketIOCallBack.onClose();

}

}

@Override

public void onFailure(WebSocket webSocket, Throwable t, @Nullable Response response) {

super.onFailure(webSocket, t, response);

log("onFailure: " + t.toString());

t.printStackTrace();

this.status = ConnectStatus.Canceled;

if (mSocketIOCallBack != null) {

mSocketIOCallBack.onConnectError(t);

}

}

private WebSocketCallBack mSocketIOCallBack;

public void setSocketIOCallBack(WebSocketCallBack callBack) {

mSocketIOCallBack = callBack;

}

public void removeSocketIOCallBack() {

mSocketIOCallBack = null;

}

}

public enum ConnectStatus {

Connecting, // the initial state of each web socket.

Open, // the web socket has been accepted by the remote peer

Closing, // one of the peers on the web socket has initiated a graceful shutdown

Closed, // the web socket has transmitted all of its messages and has received all messages from the peer

Canceled // the web socket connection failed

}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/304986.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

关于Word中审阅的一个问题!

前两天,在帮一个杂志撰稿的过程中,有一个关于Word审阅的问题。(以下内容以Word2007为例) 本身,审阅的应用不算困难。 我们可以为文章添加“批注”,或是你的上级对文章进行修改,他们可以开启“审…

ASP.NET Core - 在ActionFilter中使用依赖注入

上次ActionFilter引发的一个EF异常,本质上是对Core版本的ActionFilter的知识掌握不够牢固造成的,所以花了点时间仔细阅读了微软的官方文档。发现除了IActionFilter、IAsyncActionFilter的问题,还有一个就是依赖注入在ActionFilter上的使用也是需要注意的…

魏尔斯特拉斯函数与分形图形的动画演示

一般人会直觉上认为连续的函数必然是近乎可导的。即使不可导,所谓不可导的点也必然只占整体的一小部分。根据魏尔斯特拉斯在他的论文中所描述,早期的许多数学家,包括高斯,都曾经假定连续函数不可导的部分是有限或可数的。这可能是…

大脚战场插件怎么关闭_PM工具栏插件:HonmToolBar

视频演示:问:HonmToolBar是一款什么样的插件?答:HonmToolBar是一款高度自由化的插件,用户可以自己增加宏文件按钮或者宏命令按钮。该插件类似工具栏,有水平和垂直两个工具栏。插件悬浮在PM图形窗口左上角&a…

android 导航 美国,变美了 Android N或用全新虚拟导航按键

原标题:变美了 Android N或用全新虚拟导航按键变美了 Android N或用全新虚拟导航按键【IT168 资讯】虽然距离谷歌Android N系统的发布已经有一段时间了,不过该系统目前仍旧属于内测阶段,短时间内仍难以迅速推广。另外也正是由于Android N正式…

唐骏的商业模式

唐骏曾把商业模式比作谈恋爱,其要抓住三个要点: 1、简单: 太多的环节很难让人接受,并且容易潜藏缺陷,一目了然最好不过! 2、有创意: 一定要有自己独特的创意,一位跟随别人&#xff0…

python特性和属性_Python面向对象-类的特性及公私有属性 | 【韩涛博客】

构造函数 __init__ self.name name #属性,成员变量,字段 def sayhi() #方法,动态属性 公有属性 在类中直接定义的属性,大家都可以用 私有属性 __两个下划线定义,外部不可以访问,内部可以访问 class Role(o…

[Abp 源码分析]自动审计记录

点击上方蓝字关注我们0.简介Abp 框架为我们自带了审计日志功能,审计日志可以方便地查看每次请求接口所耗的时间,能够帮助我们快速定位到某些性能有问题的接口。除此之外,审计日志信息还包含有每次调用接口时客户端请求的参数信息,…

我的老公是枚码农

前两天看到一篇写程序员的爆文,虽然略显夸张,但也着实有趣。忽然想到身边人也是一枚码农,浑身上下也是浓厚的码农气息,遂也胡乱写了几笔,博君一笑,为了方便起见,就称其为“码农哥”。 1 码农哥还…

如何修复硬盘坏道?

首先需要先确认硬盘的坏道是逻辑坏道还是物理坏道。 方法很简单,在电脑刚启动时按“F8”键,选择“Command Prompt only”进入DOS模式。这种方法的操作系统必须为Windows95/98,若为Windows2000/XP/2003,请使用DOS启动盘启动。然后执…

c++11 string u8_深入理解C++11:C++11新

一.数据对齐在了解为什么数据需要对齐之前&#xff0c;我们可以回顾一下打印结构体的大小这个C/C中的经典案例。先看代码&#xff1a;#include using namespace std;struct HowManyBytes{char a;int b;};int main(){cout<>endl;cout<>endl;cout<>endl;cout&l…

harmonyos con,鸿蒙HarmonyOS系统中的JS开发框架

HarmonyOS开源至今已经一个多月&#xff0c;源码托管在国内知名开源平台码云上&#xff0c;https://gitee.com/openharmony 。我最感兴趣的就是JS 框架 ace_lite_jsfwk&#xff0c;从名字中可以看出来这是一个非常轻量级的框架&#xff0c;官方介绍说是“轻量级 JS 核心开发框架…

python公式_Python读取excel文件中带公式的值的实现

在进行excel文件读取的时候&#xff0c;我自己设置了部分直接从公式获取单元格的值 但是用之前的读取方法进行读取的时候&#xff0c;返回值为空 import os import xlrd from xlutils.copy import copy file_path os.path.abspath(os.path.dirname(__file__)) # 获取当前文件目…

.NET工资低?那肯定是你打开的方式不正确

点击上方蓝字关注我们因为工作的关系&#xff0c;本人总是会接触到一些刚踏入社会没多久的.NET开发小伙伴。尤其是年关将近&#xff0c;这时候想要跳槽的人特别多&#xff0c;所以收到一些小伙伴的迷茫求解。今天就拿其中一个来说&#xff0c;我们暂且称他为A同学吧。A同学是一…

10分钟读懂人工智能、机器学习到底有什么关系

文末彩蛋&#xff0c;错过哭一年。。。。 人工智能的浪潮正在席卷全球&#xff0c;诸多词汇时刻萦绕在我们耳边&#xff1a;人工智能&#xff08;Artificial Intelligence&#xff09;、机器学习&#xff08;Machine Learning&#xff09;。不少人对这些高频词汇的含义及其背后…

复制Oracle表的结构

概述&#xff1a; 复制表的结构(只复制表结构,源表名&#xff1a;b_Jkpt_Oaxt_Trafficaccident 新表名&#xff1a;Test_OAXT_TrafficAccident) Oralce语句: create table Test_OAXT_TrafficAccident as select * from b_Jkpt_Oaxt_Trafficaccident where 12

Web API实现微信公众平台开发-接收数据Post

介绍当普通微信用户向公众账号发消息时&#xff0c;微信服务器将POST消息的XML数据包到开发者填写的URL上。在微信用户和公众号产生交互的过程中&#xff0c;用户的某些操作会使得微信服务器通过事件推送的形式通知到开发者在开发者中心处设置的服务器地址&#xff0c;从而开发…

gbdt 算法比随机森林容易_随机森林与GBDT

Bagging策略1.总样本数量是n个&#xff0c;从样本中重采样(有放回的)选出n个样本 &#xff0c;会有约33.2%的样本不会被抽到2.在所有属性上对这n个样本建立分类器(比如决策树&#xff0c;svm&#xff0c;lr)3.重复步骤1和2m次&#xff0c;建立了m个分类器4.将数据放在这m个分类…

苏泊尔搭载华为鸿蒙系统,华为鸿蒙打算在一年内跨过生死线,拿下16%的市场份额...

原标题&#xff1a;华为鸿蒙打算在一年内跨过生死线&#xff0c;拿下16%的市场份额华为鸿蒙操作系统发布已经有一段时间了&#xff0c;这个操作系统直到上个月月底才开启了公测&#xff0c;很多用户都已经使用上了华为的这个鸿蒙操作系统。根据不少用户的反馈情况来看&#xff…

python获取系统时间函数_简单记录python的时间函数操作

1. time和datetime模块 import datetime,time 2. 获得当前时间 time.time() #获得当前时间&#xff0c;返回float型 time.localtime([float time]) #获得本地当前时间&#xff0c;返回time.struct_time类型 说明&#xff1a;struct_time是一个只读的9元组&#xff0c;其中参数命…