我正在尝试在Android上制作多人游戏,其中玩家使用加速度计来移动物体。最初我使用TCP发送包含X& X的数据包。作为JSON字符串的播放器的Y坐标,位于连接到加速度计的onSensorChanged()内(带有SENSOR_DELAY_GAME)。但由于延迟问题,我决定试用UDP。
现在更早,我创建了一个单独的线程,它创建了一个新的套接字,我使用了以下代码:
public void onSensorChanged(SensorEvent event) {
// Other Stuff
PrintWriter out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())),true);
out.println(coords.toString());
}
我有:
socket = new Socket(serverAddr, Port);
在另一个帖子中。
由于UDP没有提供任何此类方法来从主线程发送数据NetworkOnMainThreadException
,,我认为我必须在另一个线程中进行数据包传输。但问题是我正在计算要在onSensorChanged()
内发送的数据,并且我想在每次调用onSensorChanged()
时发送一个数据包。
我对Java和多线程相对较新,并尝试阅读有关同步的内容,但似乎无法正确理解和实现它。所以如果有人能指出解决这个问题的方法,我将不胜感激。
我还想知道在每个 SensorChange 发送坐标是否是一个好主意,是否有一种方法可以优化数据,这样我仍然可以使用TCP而不会出现延迟问题。而且我也想知道是否有任何可能的方法让onSensorChanged()
作为一个单独的线程运行......?
答案 0 :(得分:2)
对于最简单的应用程序,可以轻松解决:
DatagramSocket socket;
public void onSensorChanged() {
//calculate and create DatagramPacket here
new Thread(new Runnable() {
@Override
public void run() {
socket.send(packet);
}
});
}
它不漂亮,但它有效(onSensorChanged()
中的任何计算都不公平......)。问题是,发送线程是否必须与onSensorChanged()
方法同步。我想通了,当使用SENSOR_DELAY_GAME时,我的SGS3上的采样频率大约为20毫秒,所以它足够长,不能同步。
当然,只有当您的传感器读数计算简单且不耗时时,它才能正常工作。
但是,总而言之,计算onSensorChanged()
中的任何数据都不是一个好习惯。来自developer.android.com:
不要阻止onSensorChanged()方法
传感器数据可能会以很高的速率变化,这意味着系统可能会调用 经常使用onSensorChanged(SensorEvent)方法。作为最好的 练习,你应该尽可能少地做 onSensorChanged(SensorEvent)方法,所以你不要阻止它。如果你的 应用程序要求您进行任何数据过滤或减少 传感器数据,你应该在外面执行那项工作 onSensorChanged(SensorEvent)方法。
因此我建议将传感器数据放在某个数据容器中(即List
或sth ...)并从另一个线程访问此数据,计算并发送。
对于最后一个问题:即使有一种方法在单独的线程中运行onSensorChanged()
,对大多数应用程序来说都是致命的,因为一次可能有数千个线程(就我而言)有关,Java是一个相当克制的环境,并且在API级别上已经存在重要的防错机制。)