Если вы используете expo
, то он поддерживает аудио, вы можете увидеть в документации здесь: https://docs.expo.io/versions/v32.0.0/sdk/audio
Однако, если вы не используете expo
и создали свое приложение с react-native init
, вам нужно будет использовать зависимость, которая имеет собственные модули, или написать свой собственный собственный модуль, так как обработка аудио в потоке javascript будет заблокировать ваше приложение и сделать его непригодным для использования.
Как показывает опыт, тяжелые вычисления никогда не должны помещаться в поток GUI. Так как это - немодальное диалоговое окно, диалоговое окно не будет владеть циклом сообщения. ProcessMessage () решение будет работать, но является IMO не правильный путь. Мое предложение: 1) Икра, новый поток в OnInitDialog () 2) Имеет отдельный поток, добавляет сообщения к диалоговому окну, когда что-то интересное происходит. Одна из этих интересных вещей - то, что работа сделана.
Обратите внимание, однако, что это будет означать, что необходимо выполнить надлежащую синхронизацию.
В OnInitDialog запустите рабочий поток для выполнения вычислений. Добавьте пользовательское сообщение от рабочего потока для обновления диалогового окна.
Это превосходит реализацию ProcessMessages по нескольким причинам:
Код для того, чтобы сделать вычисления может быть разделен из кода UI, где он не принадлежит.
UI остается быстро реагирующим, в то время как фактические вычисления выполняются. ProcessMessages позволяет несколько обновлений UI во время единственной функции вычисления, но UI будет все еще заблокирован во время фактических вычислений.
Диалоговый код:
#define WM_NEW_COUNT (WM_USER + 0x101)
BEGIN_MESSAGE_MAP()
ON_MESSAGE(WM_NEW_COUNT, OnNewCount)
END_MESSAGE_MAP()
BOOL CMyDialog::OnInitDialog()
{
CWinThread* pThread = AfxBeginThread(MyCountFunc, this->GetSafeHwnd());
return TRUE;
}
LRESULT CMyDialog::OnNewCount(WPARAM wParam, LPARAM)
{
int newCount = (int)wParam;
// m_count is DDX member, e.g. for label
m_count = newCount;
UpdateData(FALSE);
return 0;
}
Рабочий поток:
UINT MyCountFunc(LPVOID lParam)
{
HWND hDialogWnd = (HWND)lParam;
for (int i=0; i < 100; ++i)
{
PostMessage(hDialogWnd, WM_NEW_COUNT, i, NULL);
}
}
Существует несколько вещей, которые можно сделать.
(1) Вы могли отправить диалоговое окно сообщение из CDialog:: метод OnInitDialog и затем обрабатывает долгую функцию в обработчике сообщений того добавленного сообщения. Тем путем диалоговое окно будет сначала отображено, и затем позже долгая функция будет выполнена.
(2) Вторая опция состоит в том, чтобы удостовериться, что цикл сообщения получает некоторое время обработки. Таким образом, если Ваша долгая функция является своего рода циклом, просто добавляют случайный вызов к ProcessMessages, чтобы удостовериться, что очередь сообщений сохранена пустой:
void ProcessMessages()
{
MSG msg;
CWinApp* pApp = AfxGetApp();
while (PeekMessage(&msg, NULL, 0, 0, PM_NOREMOVE))
{
pApp->PumpMessage();
}
}
Править: Конечно, возможно использовать потоки, такая ситуация, но выполнение так не всегда без риска и сложности.
Используя потоки со средствами GUI иметь необходимость иметь дело с несколькими очередями сообщений, который затем означает использовать API как PostThreadMessage и это представляет новый набор проблем для опасаний.
Поскольку пример одной такой проблемы обращается к этой ссылке:
http://msdn.microsoft.com/en-us/library/ms644946 (По сравнению с 85) .aspx
то, где, говорит:
Сообщения, отправленные PostThreadMessage, не связаны с окном. Как правило сообщения, которые не связаны с окном, не могут быть диспетчеризированы функцией DispatchMessage. Поэтому, если поток получателя будет в модальном цикле (как используется MessageBox или DialogBox), то сообщения будут потеряны. Для прерывания сообщений потока в то время как в модальном цикле используйте определенный для потока рычаг.
Я использую подход сообщения процесса в IDE Zeus, и он работает очень хорошо при проверке, что GUI остается быстро реагирующим пользователю. Это, также имеет преимущество того, чтобы быть очень легким реализовать.
Не пытайтесь сделать свою тяжелую работу внезапно. Имейте само диалоговое сообщение сообщение в диапазоне WM_APP в OnInitDialog. Обработчик WM_APP может внести свой вклад тяжелой работы, затем сделать другой PostMessage и возврат. Таким образом Вы позволяете насосу сообщения обрабатывать сообщения окна, промежуточные Ваши блоки обработки.