Понедельник, 15 Апреля 2024, 20:58

Приветствую Вас Гость

[ Новые сообщения · Игроделы · Правила · Поиск ]
  • Страница 1 из 1
  • 1
Форум игроделов » Программирование » Java » Не работает MediaPlayer.stop(); (java Android Studio)
Не работает MediaPlayer.stop();
al_mtДата: Суббота, 31 Октября 2015, 14:10 | Сообщение # 1
постоянный участник
Сейчас нет на сайте
Начал учить яву.
Написал простенькую рисовалку для планшета, пару классов для 2D-анимированных спрайтов, оптимистично кинулся портировать игрушки с javaScript
Аха. ЩЩаз :)

Внезапно обнаружил, что если я создаю поток - наследник Thread то из него не получается управлять объектами класса MediaPlayer !
Причём я могу создать объект, запустить на проигрывание, но методы stop() и pause() ни чего не делают, а метод release() вызывает ошибку :(

Ничего не работает, даже если я пытаюсь всё делать методами основного потока, вызывая их из другого.
Видимо я не въезжаю в какой-то фундаментальный момент.

Может быть кто подскажет?

Добавлено (31 октября 2015, 14:10)
---------------------------------------------
Пока выяснил, что сложные объекты нужно создавать и использовать в каждом потоке свои. Обмен между потоками нормально работает только для примитивов.

Может я чего перемудрявываю?
Главным потоком только создаю отдельный поток для расчётов и отдельный поток для графики.

monk05Дата: Понедельник, 02 Ноября 2015, 18:53 | Сообщение # 2
почетный гость
Сейчас нет на сайте
Пару вопросов:
1. Где создаешь объект класса MediaPlayer - в главном потоке или в каком-то дочернем?
2. Работают ли эти методы, если они будут вызваны из главного потока?
al_mtДата: Среда, 04 Ноября 2015, 22:40 | Сообщение # 3
постоянный участник
Сейчас нет на сайте
Если создаю в главном и вызываю из главного работает
Если создаю в дочернем и вызываю из дочернего - работает
Если создаю в главном, вызываю из дочернего - не работает
Если создаю в дочернем, вызываю из главного - не работает

Причём не важно, обращаюсь я напрямую к public экземпляру или через метод класса - всё равно не работает.

В данный момент приспособился, вызываю только из метода run() того потока в котором создавал, тогда всё работает.

Добавлено (04 ноября 2015, 22:40)
---------------------------------------------
Наврал sad Нихрена не работает sad

monk05Дата: Четверг, 05 Ноября 2015, 14:49 | Сообщение # 4
почетный гость
Сейчас нет на сайте
Я не силен в разработке Java приложений (больше как-то с Java EE работаю), но помню, когда еще на 2-ом курсе писали приложения на C#, там такая же штука была - нельзя было вызывать методы объектов из других процессов. Для решения этого момента была какая-то ужасная конструкция, уже не помню, что она собой представляла. Но факт остается фактом - нельзя вызывать некоторые методы объектов, относящихся к интерфейсу из другого потока.

На StackOverflow (ссылка) есть решение. Из него следует, что нужно иметь поток (либо создать его, либо использовать родительский), который будет создавать нужные тебе объекты (вдруг у тебя больше одного объекта MediaPlayer), и ждать от других потоков обработчики событий, чтобы исполнить их в контексте своего потока.

Чтобы адаптировать это решение к твоей задаче, можно сделать примерно так:

1. Сначала определить обработчик события

2. Определить класс с интерфейсом Runnable, чтобы запустить его в отдельном потоке

3. Ну и где-то там, в методе, в котором тебе надо вызывать какой-то метод класса MediaPlayer...


Сообщение отредактировал monk05 - Четверг, 05 Ноября 2015, 15:05
al_mtДата: Четверг, 05 Ноября 2015, 22:50 | Сообщение # 5
постоянный участник
Сейчас нет на сайте
Спасибо, попробую :)

Мог бы в принципе засунуть всё в один поток, но хочется разобраться...
monk05Дата: Пятница, 06 Ноября 2015, 11:40 | Сообщение # 6
почетный гость
Сейчас нет на сайте
Пока не за что :D
Отпишись, хоть буду знать, помогло или нет.


Сообщение отредактировал monk05 - Пятница, 06 Ноября 2015, 11:42
al_mtДата: Пятница, 06 Ноября 2015, 23:36 | Сообщение # 7
постоянный участник
Сейчас нет на сайте
Совершил варварство в стиле "фортран-форева!"
Вынес пачку переменных (флаги) в статический класс. Медиа-плеер заработал, теперь уже точно.

Осознаю. Виновен. Но пока - так smile
Форум игроделов » Программирование » Java » Не работает MediaPlayer.stop(); (java Android Studio)
  • Страница 1 из 1
  • 1
Поиск:

Все права сохранены. GcUp.ru © 2008-2024 Рейтинг