【问题标题】:I Cant Put Thread.sleep() in my Class extends Runnable我不能把 Thread.sleep() 放在我的类中扩展 Runnable
【发布时间】:2020-01-26 13:23:02
【问题描述】:

我使用 Socket 在 android 和 wifi 之间进行通信,当我在发送数据 3 秒后尝试断开连接时,它返回我 OutOfMemory 错误

我有一个接口来处理数据:

public interface SocketConnections {

    public void onSocketConnectionChanged(boolean isConnected, Socket socket);

    public void onMessageRecieved(String Message);

    public void onMessageSent();
}

套接字类

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();
    }

它返回我的内存错误并强制关闭我该怎么办?

【问题讨论】:

  • Thread.sleep() (a) 与 OutOfMemoryError 无关,但 (b) 在网络代码中没有位置。 Socket.isConnected() 不是对 while 条件的有效测试,并且在您测试它的任何一点都不可能是错误的。 if (in != null) 在您测试它时不可能是假的。永远不要忽略异常。这段代码有很多问题,无法回答。
  • @user207421 我的代码运行良好,它的发送数据和接收都没有错误,直到我在发送数据方法中设置延迟
  • 为什么要嵌套两个try {...} catch(Exception ignored) {} 块?
  • @SolomonSlow 那是我的坏人,其中一个没用

标签: android multithreading sockets pthreads


【解决方案1】:

好的,所以我发现了我的问题并解决了它。我不确定,但我认为当我试图在其他线程中休眠线程时,它会如何在开始之前自行停止,或者我不知道那里发生了什么,但是当我将 sleep 放入其他方法并调用它时我的第一个线程工作正常。如果有人知道的话告诉我们

【讨论】:

  • 换句话说,你仍然没有最微弱的想法。 “在其他线程中休眠线程”是没有意义的,就像“在启动之前停止自身”一样。
猜你喜欢
  • 2014-07-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-05
  • 1970-01-01
  • 2021-12-11
相关资源
最近更新 更多