Внезапно происходит сбой Socket.io: «java.lang.IllegalArgumentException: код должен содержать причину». - PullRequest
1 голос
/ 18 октября 2019

Часто мое приложение вылетает с java.lang.IllegalArgumentException: Code required to include reason. Я старался изо всех сил, чтобы уменьшить нагрузку на службу, которая запускает поток, который подключает клиентское приложение к node.js серверу, но я все еще получаю эту ошибку. Я думаю, что исключение происходит из-за ошибки в общении, когда я пытался слушать, но я не уверен.

Это мой Service класс.


public class GlobalSocketWithEventBus extends Service {
    NetworkStateChange networkStateChange;
    Socket socket;
    Socket socket2;
    String token;
    GPSTracker gpsTracker;
    SharedPreferences prefToken;
    SharedPreferences prefUser;
    Handler handler = new Handler();


    @Override
    public void onCreate() {
        super.onCreate();
        try {
            socket = IO.socket("https://hubryde-trip-service.herokuapp.com/");
            socket2 = IO.socket("https://hubryde-request-service.herokuapp.com/");
            Log.d("socket_", "Connected to Socket_Here");
            connectToWebSocket();
            handler.post(sendData);

        } catch (URISyntaxException e) {
            Log.d("ServerTimeOut", "Server Time out");
        }
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {

        prefUser = getApplicationContext().getSharedPreferences("UserProfile", 0);

        networkStateChange  = new NetworkStateChange();
        prefToken = getApplicationContext().getSharedPreferences("MyPref", 0);
        token = prefToken.getString("TOKEN", null);
        assert token != null;

        socket.
        once("allRequests"+prefUser.getString("EMAIL", null), args ->
        {
            // Log.d("Server_Socket_dashboard", "Coming in");
            JSONObject result = (JSONObject) args[0];
            //Log.d("AweleSocket_br_Service", result.toString());
            //extract data from fi red event

            //socket2.disconnect();
            EventBus.getDefault().post(
                    new EventBusModel(result));
            // extractObject(data);

        });

        return START_NOT_STICKY;
    }

    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }


    public void connectToWebSocket() {
        socket.connect();
        socket2.connect();
    }



        public void emitEventBus()  {

            gpsTracker = new GPSTracker(getApplicationContext());
            //REPEAT A METHORD AT SPECIFIC INTERVALS
            JSONObject obj = new JSONObject();
            Log.d("ProfileDashBaord_socket","Connected to Socket_Here");
            try {
                token = prefToken.getString("TOKEN", null);
                obj.put("token", token);
                obj.put("email",  prefUser.getString("EMAIL", null));
                obj.put("latitude", String.valueOf(gpsTracker.getLatitude()));
                obj.put("longitude", String.valueOf(gpsTracker.getLongitude()));
                //obj.put("bearing", String.valueOf(gpsTracker.getBearing()));
            } catch (JSONException e) {
                Log.d("ServerTimeOut", "Server Time out");
            }

           // Log.d("Board_emit",obj.toString());
            // Receiving an object

            socket.emit("busRequests", obj);

            //socket.connect();
           // Log.d("ProfileDashBoard_emit",obj.toString());
            //connect you socket client to the server

        //connect you socket client to the server
    }

    public void sendBusLocationToServer() {

        gpsTracker = new GPSTracker(getApplicationContext());
        try {
            JSONObject obj = new JSONObject();
            obj.put("latitude", gpsTracker.getLatitude());
            obj.put("token", token);
            obj.put("longitude", gpsTracker.getLongitude());
            obj.put("bearing", gpsTracker.getBearing());
            Log.d("EMMITTING", "emitting");
            obj.put("phone", prefUser.getString("PHONE", null));

            //Log.d("busLocation", String.valueOf(obj));
            //Log.d("busLocation_board", String.valueOf(obj));

            socket2.emit("busLocation", obj);
            //socket2.connect();

        } catch (JSONException e) {
            e.printStackTrace();
        }
        //connect you socket client to the server
    }

    public void freeMemory(){
        System.runFinalization();
        Runtime.getRuntime().gc();
        System.gc();
    }

Вот как яЯ обрабатываю поток для прослушивания ответа от сервера каждый раз, когда я излучаю.

   private final Runnable sendData = new Runnable(){
        public void run(){
            try {

                emitEventBus();
                sendBusLocationToServer();
                Log.d("RERUNINGPAGE", "YES" );

                handler.removeCallbacks(sendData);
                //prepare and send the data here..
                if (socket.connected()) {
                    Log.d("socket_connected_test", "connected");
                    socket.disconnect();
                    socket2.disconnect();
                } 
                handler.postDelayed(this, 5000);

            }
            catch (Exception e) {
                Log.d("Error", "exceeption1");
            }
        }
    };

Просто если я оставляю текущую активность с помощью службы, я освободил память, как эта.

   @Override
    public void onDestroy() {
        super.onDestroy();
        //handler.removeCallbacks(sendData);

        stopSelf();

        freeMemory();
    }

Каким-то образом где-то происходит что-то странное, и я получаю эту ошибку, с которой я не знаком. Это фактически указывает на то, что я слушаю.

E/AndroidRuntime: FATAL EXCEPTION: OkHttp https://hubryde-trip-service.herokuapp.com/socket.io/?EIO=3&sid=ed3R8QhpbTg5tNncAACS&transport=websocket WebSocket
    Process: com.project.hubrydemanagerapp, PID: 2582
    java.lang.IllegalArgumentException: Code required to include reason.
        at com.squareup.okhttp.internal.ws.WebSocketWriter.writeClose(WebSocketWriter.java:110)
        at com.squareup.okhttp.internal.ws.RealWebSocket.peerClose(RealWebSocket.java:146)
        at com.squareup.okhttp.internal.ws.RealWebSocket.access$100(RealWebSocket.java:31)
        at com.squareup.okhttp.internal.ws.RealWebSocket$1$2.execute(RealWebSocket.java:74)
        at com.squareup.okhttp.internal.NamedRunnable.run(NamedRunnable.java:33)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1113)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588)
        at java.lang.Thread.run(Thread.java:818)
...