Почему таймер не работает внутри на l oop? - PullRequest
0 голосов
/ 10 июля 2020

Я установил этот таймер внутри каждого элемента списка. С помощью for l oop я хотел бы выполнять каждое событие таймера каждого элемента на каждой итерации. Однако код выполняется, но таймер, похоже, не работает, все элементы сразу отображаются в списке. В чем причина этого?

Я суммировал код, чтобы включить только самое необходимое.

public class Main {

    public static void main(String[] args) {
        new Main();
    }

    public Main() {
        playList playList = new playList();

        Song song1 = new Song("song 1", "artist 1", 2000);
        playList.add(song1);
        Song song2 = new Song("song 2", "artist 2", 3000);
        playList.add(song2);
        Song song3 = new Song("song 3", "artist 3", 3500);
        playList.add(song3);
        Song song4 = new Song("song 4", "artist 4", 3500);
        playList.add(song4);

        playList.playThisList();

    }
}

class Song {
    String title;
    String artist;
    int duration;

    public Song(String title, String artist, int duration) {
        this.title = title;
        this.artist = artist;
        this.duration = duration;
    }
    public String toString() {
        return this.artist + ", " + this.title;
    }

    Timer timer = new Timer();
    TimerTask task = new TimerTask() {
        public void run () { stop(); } };


    public void play() {
        timer.scheduleAtFixedRate(task, duration, duration);
        System.out.println("Now Playing");
    }

    public void stop() {
        timer.cancel();
    }
}

class playList () {
    void playThisList()  {
        System.out.println("Playlist");
        Node node = head;
        for (int i = 0; i < count; i++) {
            node.song.play();
            node = node.next;
        }
    }
}

Я знаю, что могу использовать Thread.sleep(), но все же хочу понять, почему это Здесь невозможно использовать таймер, или как я могу его использовать в этом случае?

1 Ответ

1 голос
/ 12 июля 2020

Я внес некоторые изменения, которые, как мне кажется, делают то, что вы хотите, при этом придерживаясь «духа» вашего кода. Может быть, сравните это с вашим и посмотрите, поможет ли это.

public class Main {

    public static void main(String[] args) {
        new Main().run();
    }

    public void run() {
        playList playList = new playList();

        Song song1 = new Song("song 1", "artist 1", 2000);
        playList.add(song1);
        Song song2 = new Song("song 2", "artist 2", 3000);
        playList.add(song2);
        Song song3 = new Song("song 3", "artist 3", 3500);
        playList.add(song3);
        Song song4 = new Song("song 4", "artist 4", 3500);
        playList.add(song4);

        playList.playThisList();

    }
}

class Song {

    String title;
    String artist;
    int duration;

    public Song(String title, String artist, int duration) {
        this.title = title;
        this.artist = artist;
        this.duration = duration;
    }

    @Override
    public String toString() {
        return this.artist + ", " + this.title;
    }

    public void play() {
        System.out.println("Now Playing: " + this);
    }

}

class playList {

    Timer timer = new Timer();
    Node head = null;

    void add(Song s) {
        head = new Node(head, s);
    }

    void playThisList() {
        System.out.println("Playlist");
        playThisNode(head);
    }

    void playThisNode(Node node) {
        node.song.play();
        final Node next = node.next;
        if (next != null) {
            timer.schedule(new TimerTask() {
                @Override
                public void run() {
                    playThisNode(next);
                }
            }, node.song.duration);
        } else {
            System.out.println("Done");
            timer.cancel();
        }
    }

    class Node {

        public Node(Node next, Song song) {
            this.song = song;
            this.next = next;
        }
        final Song song;
        final Node next;
    }
}

Песни воспроизводятся в обратном порядке, но я уверен, что вы сможете это исправить!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...