【发布时间】: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