Java 在异步任务中通过套接字接收两个不同的阵列

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

我有一个用于多人游戏的Java服务器。当关键字update到达时,我希望通过连接的套接字向客户端发送两个不同的数组

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