#react-native
#react-native
Вопрос:
Я использую Agora для отправки сообщения через поток данных, он выдает эту ошибку, когда я пытаюсь сделать это после перехода на другой канал (т.Е. с канала 1 и 2). Может кто-нибудь, пожалуйста, помочь объяснить, что означает эта ошибка и как ее решить? Я искал в Google и, похоже, ничего не смог найти. Большое спасибо!
Error: invalid argument
promiseMethodWrapper@http://localhost:8081/index.bundle?platform=iosamp;dev=trueamp;minify=false:2275:45
sendStreamMessage@http://localhost:8081/index.bundle?platform=iosamp;dev=trueamp;minify=false:99747:47
http://localhost:8081/index.bundle?platform=iosamp;dev=trueamp;minify=false:98393:35
onPress@http://localhost:8081/index.bundle?platform=iosamp;dev=trueamp;minify=false:98579:46
onPress@http://localhost:8081/index.bundle?platform=iosamp;dev=trueamp;minify=false:68941:35
_performTransitionSideEffects@http://localhost:8081/index.bundle?platform=iosamp;dev=trueamp;minify=false:54979:22
_receiveSignal@http://localhost:8081/index.bundle?platform=iosamp;dev=trueamp;minify=false:54921:45
onResponderRelease@http://localhost:8081/index.bundle?platform=iosamp;dev=trueamp;minify=false:54830:34
invokeGuardedCallbackImpl@http://localhost:8081/index.bundle?platform=iosamp;dev=trueamp;minify=false:12804:21
invokeGuardedCallback@http://localhost:8081/index.bundle?platform=iosamp;dev=trueamp;minify=false:12898:42
invokeGuardedCallbackAndCatchFirstError@http://localhost:8081/index.bundle?platform=iosamp;dev=trueamp;minify=false:12902:36
executeDispatch@http://localhost:8081/index.bundle?platform=iosamp;dev=trueamp;minify=false:12974:48
executeDispatchesInOrder@http://localhost:8081/index.bundle?platform=iosamp;dev=trueamp;minify=false:12994:26
executeDispatchesAndRelease@http://localhost:8081/index.bundle?platform=iosamp;dev=trueamp;minify=false:14069:35
forEach@[native code]
forEachAccumulated@http://localhost:8081/index.bundle?platform=iosamp;dev=trueamp;minify=false:13136:22
runEventsInBatch@http://localhost:8081/index.bundle?platform=iosamp;dev=trueamp;minify=false:14093:27
runExtractedPluginEventsInBatch@http://localhost:8081/index.bundle?platform=iosamp;dev=trueamp;minify=false:14172:25
http://localhost:8081/index.bundle?platform=iosamp;dev=trueamp;minify=false:14148:42
batchedUpdates$1@http://localhost:8081/index.bundle?platform=iosamp;dev=trueamp;minify=false:24797:20
batchedUpdates@http://localhost:8081/index.bundle?platform=iosamp;dev=trueamp;minify=false:14055:36
_receiveRootNodeIDEvent@http://localhost:8081/index.bundle?platform=iosamp;dev=trueamp;minify=false:14147:23
receiveTouches@http://localhost:8081/index.bundle?platform=iosamp;dev=trueamp;minify=false:14200:34
__callFunction@http://localhost:8081/index.bundle?platform=iosamp;dev=trueamp;minify=false:2798:36
http://localhost:8081/index.bundle?platform=iosamp;dev=trueamp;minify=false:2530:31
__guard@http://localhost:8081/index.bundle?platform=iosamp;dev=trueamp;minify=false:2752:15
callFunctionReturnFlushedQueue@http://localhost:8081/index.bundle?platform=iosamp;dev=trueamp;minify=false:2529:21
callFunctionReturnFlushedQueue@[native code]
Редактировать:
Класс
// States for buttons (touchable highlights).
state = {
micPressed: false,
dotMorsePressed: false,
dashMorsePressed: false,
channel1Pressed: false,
channel2Pressed: false,
};
componentDidMount() {
SplashScreen.hide();
this.init()
}
init = async () => {
// Initialize RtcEngine and event listeners.
engine = await RtcEngine.create('74a529c906e84fe8bfe4a236869b736f');
try {
dataStreamId = await engine.createDataStream(true, true);
} catch(error) {
console.log(error.message);
}
console.log("dataStream: ", dataStreamId);
Sound.setCategory('Playback');
beep = new Sound('beep.wav', Sound.MAIN_BUNDLE, (error) => {
if (error) {
console.log('failed to load the sound', error);
return;
}
})
engine.addListener('StreamMessage', (uid, streamId, data) => {
console.log('stream message was received: ', data, ' from: ', streamId )
receivedMorse = data;
console.log(receivedMorse);
if(receivedMorse == 'dot'){
beep.setCurrentTime(9.9);
beep.play();
} else {
beep.setCurrentTime(9.7);
beep.play();
}
})
engine.addListener('StreamMessageError', (uid, streamId, err, missed, cached) => {
console.log('StreamMessageError: ', err)
})
engine.addListener('JoinChannelSuccess', (channel, uid, elapsed) => {
console.log('channel was joined succesfully')
})
engine.addListener('LeaveChannel', (channel, uid, elapsed) => {
console.log('channel was left succesfully')
})
engine.addListener('Warning', (warn) => {
console.log('Warning', warn)
})
engine.addListener('Error', (err) => {
console.log('Error', err)
})
}
Функции:
// Functions.
micPressedFunc = () => {
// Function to enable microphone and mute speaker when mic button is pressed.
engine.adjustRecordingSignalVolume(100);
engine.adjustAudioMixingVolume(0);
};
micReleasedFunc = () => {
// Function to mute microphone and enable speaker when mic button is released.
engine.adjustRecordingSignalVolume(0);
engine.adjustAudioMixingVolume(100);
};
dotMorsePressedFunc = () => {
// Function to send dot to other users in the channel.
engine.sendStreamMessage(dataStreamId, 'dot');
beep.setCurrentTime(9.9);
beep.play();
};
dashMorsePressedFunc = () => {
// Function to send dash to other users in the channel.
engine.sendStreamMessage(dataStreamId, 'dash');
beep.setCurrentTime(9.7);
beep.play();
};
channel1PressedFunc = () => {
// Function to leave previous channel and join channel 1.
engine.leaveChannel();
engine.joinChannel(null, 'walt-channel-1', null, 0);
engine.adjustRecordingSignalVolume(0);
engine.adjustAudioMixingVolume(100);
isConnected = true;
this.setState({
channel1Pressed: true,
channel2Pressed: false,
});
};
channel2PressedFunc = () => {
// Function to leave previous channel and join channel 2.
engine.leaveChannel();
engine.joinChannel(null, 'walt-channel-2', null, 0);
engine.adjustRecordingSignalVolume(0);
engine.adjustAudioMixingVolume(100);
isConnected = true;
this.setState({
channel2Pressed: true,
channel1Pressed: false,
});
};
Комментарии:
1. Пожалуйста, добавьте немного исходного кода. Само по себе это не помогает.
2. @sfratini я добавил некоторый исходный код по вашему запросу.
3. Все ли они синхронны с выходом / присоединением к каналу? Я мог бы ожидать, что это будут обещания или какие-то длительные операции, которые, возможно, придется подождать. Но это только мои догадки.
4. @sfratini это асинхронно
Ответ №1:
Просматривая документацию, кажется, что вы неправильно обрабатываете события и порядок. Например, в канале leave говорится следующее:
«После присоединения к каналу пользователь должен вызвать метод leaveChannel для завершения вызова перед присоединением к другому каналу. Этот метод возвращает 0, если пользователь покидает канал и освобождает все ресурсы, связанные с вызовом. Этот вызов метода является асинхронным, и пользователь не вышел из канала, когда возвращается вызов метода. Как только пользователь покидает канал, SDK запускает обратный вызов onLeaveChannel «.
Таким образом, по сути, пользователь, присоединяющийся / покидающий канал, не является немедленным, и вам приходится иметь с этим дело. Я не могу сказать точную проблему, но я могу сказать, что я не думаю, что вы правильно обрабатываете жизненный цикл.
По крайней мере, вы можете попытаться дождаться методов из движка, но одного этого может быть недостаточно. Возможно, вам потребуется покинуть канал, а затем присоединиться к новому, как только вы получите подтверждение.