android中outputstream.write()为什么不会立即发送写入的数据
时间: 2023-05-21 08:05:15 浏览: 49
android 中outputstream.write() 方法并不是立即发送数据的,它只是把待发送的数据放入缓冲区中,等待一定条件满足后再发送。这可以提高发送效率,减少网络负担。如果想要立即发送数据,可以调用outputstream.flush() 方法来清空缓冲区,强制发送数据。
相关问题
Android studio中在自定义控件中设置监听器监听手指在容器内的触摸动作,并返回两个浮点数坐标,建立了线程来向服务器发送数据流,匿名内部类中处理监听的动作,并且启动线程,当手指动作还未停止上,线程内的outputstream.write()与outputstream.flush()不立即清空缓冲区,怎么做到在监听手指动作的同时,又能发送数据,并用代码举例说明
A:
首先,在自定义控件中,我们可以使用 onTouchEvent() 方法来监听控件内的手指触摸动作,并返回对应的坐标。示例代码如下:
```
public class MyView extends View {
private float lastX, lastY;
@Override
public boolean onTouchEvent(MotionEvent event) {
float x = event.getX();
float y = event.getY();
switch (event.getAction()) {
case MotionEvent.ACTION_MOVE:
// TODO: 处理手指移动事件,可在此处发送数据
break;
case MotionEvent.ACTION_UP:
// TODO: 处理手指抬起事件,发送最后一次数据
break;
}
lastX = x;
lastY = y;
return true;
}
}
```
在 onTouchEvent() 方法中,我们可以根据手指移动的坐标,在匿名内部类中启动一个线程,发送数据流到服务器。具体代码如下:
```
public class MyView extends View {
private float lastX, lastY;
private OutputStream outputStream;
public MyView(Context context) {
super(context);
// TODO: 初始化 outputStream(例如在构造函数中)
}
@Override
public boolean onTouchEvent(MotionEvent event) {
float x = event.getX();
float y = event.getY();
switch (event.getAction()) {
case MotionEvent.ACTION_MOVE:
// 发送移动数据
sendData(x, y);
break;
case MotionEvent.ACTION_UP:
// 发送最后一次数据
sendData(x, y);
break;
}
lastX = x;
lastY = y;
return true;
}
private void sendData(final float x, final float y) {
new Thread(new Runnable() {
@Override
public void run() {
try {
outputStream.write((x + "," + y + "\n").getBytes());
outputStream.flush();
} catch (IOException e) {
e.printStackTrace();
}
}
}).start();
}
}
```
在 sendData() 方法中,我们启动了一个新线程,将接收到的坐标字符串按字节数组形式写入到 outputStream 中,并调用 outputStream.flush() 方法及时清空缓冲区,确保数据及时发送到服务器。
public void send(String str) { if(str.isEmpty())return; try { byte[] bytes; if (!isHex16Enabled) { bytes = str.getBytes(); Log.d(TAG,"send(org)="+ str); } else { bytes = StringUtils.hexStringToByteArray(str); Log.d(TAG, "send(16hex)="+new String(bytes,"UTF-8")); } if (outputStream != null) { if(isPreSuffixEnabled)outputStream.write(PREFIX); outputStream.write(bytes);//写入数据 if(isPreSuffixEnabled)outputStream.write(SUFFIX); outputStream.flush(); } } catch (IOException e) { e.printStackTrace(); } }
这段代码定义了一个发送数据的方法send,用于向蓝牙设备发送数据。首先对发送的字符串进行判空操作,如果为空则直接返回。然后根据是否启用了16进制发送模式,将字符串转换成字节数组。如果使用了16进制发送模式,则将字节数组转换成字符串进行日志输出。接着判断输出流不为空,如果不为空,则将数据写入输出流中,并在数据前后添加前缀和后缀(如果启用了前后缀模式)。最后刷新输出流。如果在写入数据时出现IO异常,则打印异常栈信息。这个方法可以在Android中用于向蓝牙设备发送数据。