Java 在异步任务中通过套接字接收两个不同的阵列
我有一个用于多人游戏的Java服务器。当关键字update到达时,我希望通过连接的套接字向客户端发送两个不同的数组Java 在异步任务中通过套接字接收两个不同的阵列,java,sockets,android-asynctask,Java,Sockets,Android Asynctask,我有一个用于多人游戏的Java服务器。当关键字update到达时,我希望通过连接的套接字向客户端发送两个不同的数组 output.reset(); output.writeObject(array1); output.writeObject(array2); 其中,array1是int[16],array2是int[2][2] 在Android客户端中,我有两个异步任务来捕获数组 @Override protected int[] doInBackground(ObjectInputStrea
output.reset();
output.writeObject(array1);
output.writeObject(array2);
其中,array1是int[16],array2是int[2][2]
在Android客户端中,我有两个异步任务来捕获数组
@Override
protected int[] doInBackground(ObjectInputStream...params) {
ObjectInputStream ois = params[0];
try {
arrayFromServer = (int[]) (ois.readObject());
} catch (ClassNotFoundException | IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return arrayFromServer;
}
及
我通过计时器将它们传递给我的UI活动,计时器每20秒发送一次关键字update
public void startTimer() {
timer = new Timer();
initializeTimerTask();
timer.schedule(timerTask, 5000, 20000);
}
public void initializeTimerTask() {
timerTask = new TimerTask() {
public void run() {
handler.post(new Runnable() {
public void run() {
//AsyncTask
new CardTask() {
@Override
public void onPostExecute(int[] result) {
mFromServer = result;
}
}.execute(ois);
//AsyncTask
new PointsAndCardsTask() {
@Override
public void onPostExecute(int[][] result) {
mComplexArray = result;
}
}.execute(ois);
}
});
}
};
}
但是这给我的游戏带来了一些问题,我想知道我在发送数组时是否做错了什么,或者是否有更好的方法
我得到的错误是
08-17 15:39:57.196: E/AndroidRuntime(665): FATAL EXCEPTION: main
08-17 15:39:57.196: E/AndroidRuntime(665): java.lang.ArrayIndexOutOfBoundsException
因为当需要一个数组时,我得到的是另一个。我无法解释Java在(反)序列化这些数组时会发生什么,但我确实确信Java不能在数组之间有所不同,因此您不能确保只获得具有所需维度的数组
我将把您发送的数据封装在不同的Java对象中。通过这样做,您可以使用的实例来确保只得到您想要的 我无法解释Java(反)序列化这些数组时在Java中发生了什么,但我确实确信Java不能在数组之间有所不同,因此您不能确保只获取具有所需维度的数组
我将把您发送的数据封装在不同的Java对象中。通过这样做,您可以使用的实例来确保只得到您想要的 我很确定你不需要用runnable启动一个新线程来初始化异步任务。@andrewdleach我添加了这个部分,因为我使用了一个计时器处理程序……我不需要这样做?是的。AsyncTask唯一需要的是执行调用。此外,您需要将PASSACTILE调用中的那些移动到您的子类AsyncTasks CardTask和PooToStCaldStaskOK中,考虑使用Android代码的ALARMMARKER。它是专门为Android框架编写的,可以在不管理线程的情况下启动和停止。@AndrewLeach Ok谢谢。那我去看看经理。谢谢你的回复。我很确定你不需要用runnable启动一个新线程来初始化异步任务。@AndrewLeach我添加了这个部分,因为我使用了一个计时器处理程序…我不需要这样做?是的。AsyncTask唯一需要的是执行调用。此外,您需要将PASSACTILE调用中的那些移动到您的子类AsyncTasks CardTask和PooToStCaldStaskOK中,考虑使用Android代码的ALARMMARKER。它是专门为Android框架编写的,可以在不管理线程的情况下启动和停止。@AndrewLeach Ok谢谢。那我去看看经理。谢谢你的回复。
08-17 15:39:57.196: E/AndroidRuntime(665): FATAL EXCEPTION: main
08-17 15:39:57.196: E/AndroidRuntime(665): java.lang.ArrayIndexOutOfBoundsException