Android Okhttp 3に基づくwebSocketエラー再接続と保証長接続(2つのスレッドが交互に行われる)

3343 ワード

ここ数日、websockを使用してリアルタイムで通信し、長時間の接続を保証する需要があります.
WebSocket再接続はスレッドを用いてタイミングよく行う(すなわち,切断後に再接続する).この方法は愚かだと思いますが、この方法は有効です.
1、タイミング接続スレッド、比較的簡単な一つの継承Threadのクラス
public class ReconnectionWSThread extends Thread {

    public volatile boolean isStop = false; //      

    @Override
    public void run() {
        super.run();

        while (!isStop) {
            try {
                LogUtils.e("ReconnectionWSThread", " --- ReconnectionWSRThread    ");
                Thread.sleep(10 * 60 * 1000);              
                //    
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}

2、エラー再接続スレッド
public class ReconnectionWSErrorThread extends Thread {

    public volatile boolean isStop = false; //      

    @Override
    public void run() {
        super.run();

        while (!isStop) {
            try {

                LogUtils.e("ReconnectionWSErrorThread", " --- ReconnectionWSErrorThread    ");

                Thread.sleep(2 * 1000); 

                //    

            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}

通常の長接続スレッド(ReconnectionWSThread)は、適切な位置でオンにすると、主にエラー再接続(ReconnectionWSErrorThread)と交互に動作します.
OK httpでwebsocket通信をサポート:通信中にエラーが発生したり、接続が切断されたりした場合、onFailureメソッドに戻ります.
    @Override
    public void onFailure(WebSocket webSocket, Throwable t, Response response) {
        super.onFailure(webSocket, t, response);
        BaseApplication.isReconnect = true;//    

        BaseApplication.BaseReconnectionWSThread.isStop = true; //        

        if (BaseApplication.isErrorReconnect) { //     onFailure  
            BaseApplication.BaseReconnectionWSErrorThread.start(); //      
            BaseApplication.isErrorReconnect = false;
        } else {
            if (!BaseApplication.BaseReconnectionWSErrorThread.isAlive()) { //    run         ,   run       ,        
                BaseApplication.BaseReconnectionWSErrorThread = new ReconnectionWSErrorThread(); //       
                BaseApplication.BaseReconnectionWSErrorThread.start();
            }
        }
    }

onMessageリターン中:
        //    
        if (BaseApplication.isReconnect) {

            BaseApplication.BaseReconnectionWSErrorThread.isStop = true;

            BaseApplication.isReconnect = false;

            BaseApplication.BaseReconnectionWSThread =  new ReconnectionWSThread(); //      
            BaseApplication.BaseReconnectionWSThread.start();
        }

BaseApplition:
public class BaseApplication extends Application {

    public static boolean isReconnect = false;
    public static boolean isErrorReconnect = true;
    public static ReconnectionWSThread BaseReconnectionWSThread;
    public static ReconnectionWSErrorThread BaseReconnectionWSErrorThread;

    @Override
    public void onCreate() {

        BaseReconnectionWSThread = new ReconnectionWSThread();
        BaseReconnectionWSErrorThread = new ReconnectionWSErrorThread();
        super.onCreate();
    }

    public static BaseRequest getBaseRequestInstance(){

        return BaseRequestInstance;
    }
}

附:もっと良い方法があれば、討論の指摘を歓迎して、感謝します!!!