OkHttpのWebSocketによる長接続

4052 ワード

ハートビートパケットの送信(接続状態の確認)
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;
        }
    }