1. Вы находитесь в сообществе Rubukkit. Мы - администраторы серверов Minecraft, разрабатываем собственные плагины и переводим на различные языки плагины наших коллег из других стран.
    Скрыть объявление
Скрыть объявление
В преддверии глобального обновления, мы проводим исследования, которые помогут нам сделать опыт пользования форумом ещё удобнее. Помогите нам, примите участие!

Помогите Нужно обновлять информацию в GUI в фоне, не мешая другим командам

Тема в разделе "Разработка плагинов для новичков", создана пользователем Cheater, 28 дек 2017.

  1. Автор темы
    Cheater

    Cheater Активный участник Пользователь

    Баллы:
    66
    Имя в Minecraft:
    Skriep
    Всем привет. Я пишу плагин, который должен добавлять стримы в базу данных, а затем при вводе команды показывать стримы в GUI интерфейсе. Но проблема в том, что количество зрителей на стриме часто меняется, а мне надо, чтобы это количество было видно игрокам, для этого надо постоянно обновлять информацию о стримах (количество зрителей, название и т.д.), на это сервер тратит много времени, около 1.5 секунды на проверку одного стрима (ну это понятно, сервер должен соединиться с серверами ютуба). Т.е. обновлять эту информацию перед каждым открытием GUI не вариант, слишком большая задержка. Я хочу сделать так, чтобы информация обновлялась каждые секунд 30. Для этого я использую таймер на BukkitRunnable. Вроде всё работает, но если попытаться открыть GUI во время обновления информации, то придётся опять долго ждать.
    Если кратко, то мне надо обновлять информацию о стримах как-нибудь в фоне, при этом не закрывая GUI и не мешая выполнению всех остальных команд. Как это можно сделать?
     
  2. _MasterCapeXD_

    _MasterCapeXD_ Активный участник Пользователь

    Баллы:
    76
    Имя в Minecraft:
    _MasterCapeXD_
    Сделать какой-то метод startUpdater (в нем делать все в runTaskTimerAsyncronously), в onEnable его запустить, и если игроков 0, можно стопать таск.
     
  3. Автор темы
    Cheater

    Cheater Активный участник Пользователь

    Баллы:
    66
    Имя в Minecraft:
    Skriep
    А как сделать этот runTaskTimerAsyncronously?
     
  4. Cool_boy

    Cool_boy Активный участник Пользователь

    Баллы:
    96
    Имя в Minecraft:
    prettydude
    А как ты Runnable запускаешь?
     
  5. Cool_boy

    Cool_boy Активный участник Пользователь

    Баллы:
    96
    Имя в Minecraft:
    prettydude
    Тогда в PlayerJoinEvent добавить запуск если таймер не запущен.
     
  6. Автор темы
    Cheater

    Cheater Активный участник Пользователь

    Баллы:
    66
    Имя в Minecraft:
    Skriep
    Всё, понял, тупанул. Сейчас попробую.
     
  7. Автор темы
    Cheater

    Cheater Активный участник Пользователь

    Баллы:
    66
    Имя в Minecraft:
    Skriep
    new BukkitRunnable() {}
     
  8. Cool_boy

    Cool_boy Активный участник Пользователь

    Баллы:
    96
    Имя в Minecraft:
    prettydude
    Ты его создаёшь, запускай через
     
  9. Автор темы
    Cheater

    Cheater Активный участник Пользователь

    Баллы:
    66
    Имя в Minecraft:
    Skriep
    Всё бы хорошо, но если попытаться открыть GUI во время обновления информации, то выдаст ошибку null.
     
  10. Cool_boy

    Cool_boy Активный участник Пользователь

    Баллы:
    96
    Имя в Minecraft:
    prettydude
    Как вообще устроен твой плагин?
     
  11. Автор темы
    Cheater

    Cheater Активный участник Пользователь

    Баллы:
    66
    Имя в Minecraft:
    Skriep
    Немного кривовато)
    После ввода команды с сылкой на стрим плагин достаёт количество зрителей и название стрима с помощью Jsoup. Если всё нормально, то добавляет стрим в бд (знаю, тут проще было бы в плагине всё держать, но такое ТЗ). При открытии GUI берутся данные из бд, затем добавляются в lore и displayname. Потом у игрока открывается GUI интерфейс (инвентарь) со всеми стримами. Ну а теперь я хочу всё это обновлять каждые 30 секунд (опять через Jsoup).
     
  12. hyndorik

    hyndorik Активный участник Пользователь

    Баллы:
    98
    Имя в Minecraft:
    hyndo
    Ну и костыли, у youtube есть апи свое для этого, как у тебя вообще jsoup будет работать если он парсит ток DOM дерево, а там на ютубе страница динамически генерируются. И я чет не понял, ты когда гуи открываешь каждый раз берешь данные из бд?) И когда обновляешь данные там через свой jsoup каждые 30 секунд, я так понимаю, что ты чистишь коллекцию со стримами? Иначе там то ведь нулл не может быть, не делай этого, просто заменяй, я ж так думаю у тебя там какой-то HashMap наверно
     
  13. Автор темы
    Cheater

    Cheater Активный участник Пользователь

    Баллы:
    66
    Имя в Minecraft:
    Skriep
    Но Jsoup там работает... Очень даже хорошо работает. Да, каждый раз беру из бд. Нет, я просто заменяю. Не знаю, откуда там null, но он там есть, и это факт. А HashMap'a нету. Ещё раз повторю, я знаю, что через HashMap лучше делать, но ТЗ делать всё через бд.
     
  14. Автор темы
    Cheater

    Cheater Активный участник Пользователь

    Баллы:
    66
    Имя в Minecraft:
    Skriep
    Я понимаю, что это костыли, но, в конце концов, это только alpha версия плагина.
     
  15. Автор темы
    Cheater

    Cheater Активный участник Пользователь

    Баллы:
    66
    Имя в Minecraft:
    Skriep
    А... я понял... ну да, тут можно через HashMap, чёт тупанул. Днём попробую переписать с ютубовским апи. Надеюсь, получится.
     
  16. hyndorik

    hyndorik Активный участник Пользователь

    Баллы:
    98
    Имя в Minecraft:
    hyndo
    У тебя основа вся кривая, следующие версии лучше не станут с этой хренью
     
  17. Автор темы
    Cheater

    Cheater Активный участник Пользователь

    Баллы:
    66
    Имя в Minecraft:
    Skriep
    А кто мне запрещает изменить основу в следующих версиях?
     
  18. alexandrage

    alexandrage Старожил Пользователь

    Баллы:
    173
    Кеширование не не слышал?
     
  19. Автор темы
    Cheater

    Cheater Активный участник Пользователь

    Баллы:
    66
    Имя в Minecraft:
    Skriep
    Не слышал.
     
  20. alexandrage

    alexandrage Старожил Пользователь

    Баллы:
    173
    List cache= new ArrayList(list);
     

Поделиться этой страницей