Java Swing中的publish()/process()交互错误

Java Swing中的publish()/process()交互错误,java,swing,swingworker,Java,Swing,Swingworker,我正在用java编写一个在线视频游戏。我已经完成了服务器,现在进入了客户端。 我的问题出在socket listener代码的某个地方,这是一个swingworker子类,其工作是监听服务器(doInBackGround())并根据需要更新游戏地图 代码如下: import javax.swing.*; import java.util.List; public class GameWorker extends SwingWorker<Void, String> { pr

我正在用java编写一个在线视频游戏。我已经完成了服务器,现在进入了客户端。 我的问题出在socket listener代码的某个地方,这是一个swingworker子类,其工作是监听服务器(doInBackGround())并根据需要更新游戏地图

代码如下:

import javax.swing.*;
import java.util.List;

public class GameWorker extends SwingWorker<Void, String> {

    private SocketStreamsBean streams;
    private GameFrame game;

    public GameWorker(SocketStreamsBean streams, GameFrame game) {
        this.streams = streams;
        this.game = game;
    }

    @Override
    protected Void doInBackground() throws Exception {
        for(String msg = streams.getIn().readLine(); msg != null; msg = streams.getIn().readLine()){
            System.out.println("bp "  + msg + " " + Thread.currentThread().getId());//TODO remove
            publish(msg);
            System.out.println("ap "  + msg + " " + Thread.currentThread().getId());//TODO remove
        }
        return null;
    }

    @Override
    protected void process(List<String> list) {

        for(String msg = list.remove(0); list.size() != 0; msg = list.remove(0)) {
            System.out.println("dp "  + msg + " " + Thread.currentThread().getId());//TODO remove
            String[] cmds = msg.split(":");
            switch (cmds[0]) {
                case "ADD":
                    game.add(cmds[1], cmds[2], cmds[3]);
                    break;
                case "MOVE":
                    game.remove(cmds[1]);
                    game.add(cmds[1], cmds[2], cmds[3]);
                    break;
                case "REMOVE":
                    game.remove(cmds[1]);
                    break;
                case "BULLETS":
                    //game.addBullets(cmds[1]);
            }
        }
        list.clear();
    }
}
import javax.swing.*;
导入java.util.List;
公共类GameWorker扩展SwingWorker{
私有SocketStreams Bean streams;
私人游戏框架游戏;
公共游戏工作者(SocketStreamsBean streams、游戏框架游戏){
this.streams=溪流;
这个游戏=游戏;
}
@凌驾
受保护的Void doInBackground()引发异常{
对于(字符串msg=streams.getIn().readLine();msg!=null;msg=streams.getIn().readLine()){
System.out.println(“bp”+msg+“”+Thread.currentThread().getId());//TODO删除
发布(msg);
System.out.println(“ap”+msg+“”+Thread.currentThread().getId());//TODO删除
}
返回null;
}
@凌驾
受保护的无效进程(列表){
对于(字符串msg=list.remove(0);list.size()!=0;msg=list.remove(0)){
System.out.println(“dp”+msg+“”+Thread.currentThread().getId());//TODO删除
字符串[]cmds=msg.split(“:”);
交换机(cmds[0]){
案例“添加”:
添加(cmds[1],cmds[2],cmds[3]);
打破
案例“移动”:
游戏移除(cmds[1]);
添加(cmds[1],cmds[2],cmds[3]);
打破
“删除”案例:
游戏移除(cmds[1]);
打破
案例“子弹”:
//game.addBullets(cmds[1]);
}
}
list.clear();
}
}

根据三个debug println(),当播放机移动并且服务器将其广播给所有客户端时,消息被读取和发布,但从未被处理。这是怎么回事?

您在
循环-
列表中两次从列表中删除消息。删除(0)

下面是一种迭代列表的简单方法:

for(String msg : list){
    System.out.println(msg);
}

您在
循环-
列表的
中两次从列表中删除消息。删除(0)

下面是一种迭代列表的简单方法:

for(String msg : list){
    System.out.println(msg);
}

不要从process方法中的列表中删除。只需迭代和处理。不要从process方法的列表中删除。简单地迭代和处理。我真的不明白这两件事是如何联系在一起的,但它确实起了作用,谢谢@StefanoBerti不客气!您甚至在有机会处理邮件之前就从列表中删除了邮件。根本不需要删除/更新列表。只需迭代列表。我希望这有助于澄清一点:)我真的不明白这两件事是如何联系在一起的,但它确实起了作用,谢谢@StefanoBerti不客气!您甚至在有机会处理邮件之前就从列表中删除了邮件。根本不需要删除/更新列表。只需迭代列表。我希望这有助于澄清一点:)