【问题标题】:Bad publish() / process() interaction in Java SwingJava Swing 中的错误 publish() / process() 交互
【发布时间】:2017-08-25 16:14:43
【问题描述】:

我正在用 java 编写一个在线视频游戏。我已经完成了服务器,现在我进入了客户端。 我的问题在于套接字侦听器代码的某个地方,这是一个 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();
    }
}

根据三个调试 println() 当玩家移动并且服务器将其广播给所有客户端时,消息被读取并发布但从未处理。怎么可能?

【问题讨论】:

  • 不要从处理方法中的列表中删除。只需迭代和处理。

标签: java swing swingworker


【解决方案1】:

您在 for 循环中从列表中删除了两次消息 - list.remove(0):

for(String msg = list.remove(0); list.size() != 0; msg = list.remove(0))

这是一个迭代列表的简单方法:

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

【讨论】:

  • 我真的不明白这两件事是如何相关的,但它确实有效,谢谢!
  • @StefanoBerti 欢迎您!您甚至在有机会处理它们之前就从列表中删除了它们。根本不需要删除/更新列表。只需迭代列表。我希望它有助于澄清一点:)
猜你喜欢
  • 2012-03-12
  • 1970-01-01
  • 2020-11-15
  • 1970-01-01
  • 2011-05-13
  • 1970-01-01
  • 2019-05-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多