Я не могу поставить Thread.sleep () в моем классе расширяет Runnable - PullRequest
0 голосов
/ 26 сентября 2019

я использую сокет для связи между android и wifi, он возвращает мне ошибку OutOfMemory, когда я пытаюсь отключиться через 3 секунды после отправки данных

у меня есть интерфейс для обработки данных:

public interface SocketConnections {

    public void onSocketConnectionChanged(boolean isConnected, Socket socket);

    public void onMessageRecieved(String Message);

    public void onMessageSent();
}

SocketClass

public class connectSocket implements Runnable {

    public Socket socket;
    private DataOutputStream out;
    private InputStream in;
    private SocketConnections connections;
    private static final String TAG = "connectSocket";

    public connectSocket(SocketConnections connections) {
        this.connections = connections;
    }

    @Override
    public void run() {
        connect();
    }

    private void connect() {
        disconnect();
        try {
            try {
                new Thread(new Runnable() {
                    @Override
                    public void run() {
                        try {
                            Thread.sleep(1000);
                            socket = new Socket(wsConfig.HOST_ADDRESS, wsConfig.PORT_NUMBER);
                            socket.setTcpNoDelay(true);
                            socket.setKeepAlive(true);
                            if (socket.isConnected()) {
                                connections.onSocketConnectionChanged(true, socket);
                                Log.i(TAG, "Connected");
                                while (socket.isConnected()) {
                                    out = new DataOutputStream(socket.getOutputStream());
                                    in = socket.getInputStream();
                                    String S;

                                    if (in != null) {
                                        while (true) {
                                            byte[] content = new byte[1024];
                                            try {
                                                Thread.sleep(2000);
                                                int bytesRead = in.read(content);
                                                if (bytesRead == -1) {
                                                    break;
                                                }
                                                byte[] x = Arrays.copyOfRange(content, 0, bytesRead);
                                                Log.i(TAG, "run: " + x.length);
                                                S = Util.fromByteArrayToHexString(x);
                                                connections.onMessageRecieved(S);
                                            } catch (Exception e) {
                                            }
                                        }
                                    }
                                }
                            }
                        } catch (Exception e) {
                            connections.onSocketConnectionChanged(false, socket);
                            e.printStackTrace();
                        }
                    }
                }).start();
            } catch (Exception ignored) {
            }
        } catch (Exception ignored) {
        }
    }

    public void sendData(final byte[] S) {
        Runnable runnable = new Runnable() {
            @Override
            public void run() {
                try {
                    Thread.sleep(100);
                    out.write(S);
                    out.flush();
                    connections.onMessageSent();
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }

        };
        Thread thread = new Thread(runnable);
        thread.start();
    }

    public void disconnect() {
        if (socket != null && socket.isConnected()) {
            try {
                socket.close();
                connections.onSocketConnectionChanged(false, socket);
//                Toast.makeText(G.context, "سیستم به سرور متصل نیست.", Toast.LENGTH_SHORT).show();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

я хочу добавить 3-секундную задержку после отправки данных и отключиться следующим образом

 public void sendData(final byte[] S) {
        Runnable runnable = new Runnable() {
            @Override
            public void run() {
                try {
                    Thread.sleep(100);
                    out.write(S);
                    out.flush();
                    connections.onMessageSent();
                    Thread.sleep(3000);
                    disconnect();
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }

        };
        Thread thread = new Thread(runnable);
        thread.start();
    }

это вернет мне ошибку памяти и принудительно закроет, что мне делать?

...