OkHttpのWebSocketによる長接続
4052 ワード
ハートビートパケットの送信(接続状態の確認)
初期化時
WebSocketが返す状態(返すデータはサブスレッドにあり、uiを更新するにはメインスレッドで更新する必要があることに注意)
private long sendTime = 0L;
//
private Handler mHandler = new Handler();
// 2 ,
private static final long HEART_BEAT_RATE = 10 * 1000;
//
private Runnable heartBeatRunnable = new Runnable() {
@Override
public void run() {
if (System.currentTimeMillis() - sendTime >= HEART_BEAT_RATE) {
//
String message = "{\"type\":\"quote\"}";
mWebSocket.send(message);
sendTime = System.currentTimeMillis();
}
mHandler.postDelayed(this, HEART_BEAT_RATE); // ,
}
};
初期化時
// ,
mHandler.postDelayed(heartBeatRunnable, HEART_BEAT_RATE);
connectWebSocket();
WebSocketが返す状態(返すデータはサブスレッドにあり、uiを更新するにはメインスレッドで更新する必要があることに注意)
public void connectWebSocket() {
OkHttpClient client = new OkHttpClient.Builder()
.retryOnConnectionFailure(true)//
.readTimeout(5, TimeUnit.SECONDS)//
.writeTimeout(5, TimeUnit.SECONDS)//
.connectTimeout(5, TimeUnit.SECONDS)//
.build();
String url = "ws://www.trbbex.com/websocket";//web.xxx.xxx.com:xxx// url
Request request = new Request.Builder().url(url).build();
WebSocket webSocket = client.newWebSocket(request, new WebSocketListener() {
// ( , UI Handler)
@Override
public void onOpen(WebSocket webSocket, Response response) {
super.onOpen(webSocket, response);
mWebSocket = webSocket;
webSocket.send("{\"type\":\"quote\"}");
//
}
@Override
public void onMessage(WebSocket webSocket, String text) {
super.onMessage(webSocket, text); // , ui
if (text.contains("connect")) {
return;
} else {
list = new Gson().fromJson(text, WebBean.class).getData();
// handler button text
Message message = handler.obtainMessage();
message.obj=list;
message.what = 20;
handler.sendMessage(message);
}
}
@Override
public void onMessage(WebSocket webSocket, ByteString bytes) {
super.onMessage(webSocket, bytes);
}
@Override
public void onFailure(WebSocket webSocket, Throwable t, @Nullable Response response) {
super.onFailure(webSocket, t, response);
// t.getMessage()
// socket
try {
webSocket.close(1000, null);
mHandler.postDelayed(new Runnable() {
@Override
public void run() {
connectWebSocket();
}
},2000);
} catch (Exception e) {
e.printStackTrace();
}
}
});
}
```css
@Override
public void onDestroy() {
super.onDestroy();
// handler ,
if (mHandler != null) {
mHandler.removeCallbacksAndMessages(null);
mHandler = null;
}
if (mWebSocket != null) {
mWebSocket.close(1000, null);
}
if (mHandler != null) {
mHandler.removeCallbacksAndMessages(null);
mHandler = null;
}
// handler
if (handler!=null){
handler.removeCallbacksAndMessages(null);
handler = null;
}
}