Недавно я создал приложение для очередей, я использую zeromq для соединения сервера android и клиента android. вот моя проблема: у меня есть две задачи asyn c: одна для передачи сообщения zeromq, а другая для воспроизведения медиаплеера
проблема, когда у меня есть две asyncTask, я использую executeonexecutor (Asyn c. THREAD_POOL_EXECUTOR), но у него есть задержка между отправкой сообщения и воспроизведением звука, но
- zeromq работает быстро, без выполнения asynctask mediaplayer
- медиаплеер работает отлично либо
как я могу улучшить время задержки?
zeromq
class ZeroMessageListener(uiThreadHandler: Handler) : AsyncTask<Void?, Void?, Void?>() {
private val uiThreadHandler: Handler
override fun doInBackground(vararg params: Void?): Void? {
socket.bind("tcp://*:5656")
while (isConnected) {
try {
val msg: ByteArray = socket.recv(0)
var m: Message = Message()
var b: Bundle = Bundle()
b.putCharSequence("MESSAGE", String(msg))
m.data = b
uiThreadHandler.sendMessage(m)
socket.send(msg, 0)
} catch (e: Exception) {
}
}
isConnected = false
socket.close()
context.term()
this.cancel(true)
return null
}
}
обработчик сообщений
private val serverMessageHandler: MessageListenerHandler = MessageListenerHandler(
object : IMessageListener{
override fun messageReceived(messageBody: String?) {
//set sound
...
//execute the sound
play.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR)
}
}
}
//execute zeromq
zmq.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR)
воспроизведение звука
class PlayMedia : AsyncTask<Void?, Void?, Void?> {
var context: Context? = null
private var mediaPlayer: MediaPlayer
lateinit var soundIDs: IntArray
var idx = 1
var enable=true
var audioManager:AudioManager
lateinit var afChangeListener:AudioManager.OnAudioFocusChangeListener
private val handler = Handler()
constructor(context: Context?, soundIDs: IntArray) {
this.context = context
this.soundIDs = soundIDs
this.mediaPlayer = MediaPlayer.create(context, soundIDs[0])
this.audioManager=context!!.getSystemService(Context.AUDIO_SERVICE) as AudioManager
focus()
setNextMediaForMediaPlayer(mediaPlayer)
}
fun focus(){
afChangeListener = AudioManager.OnAudioFocusChangeListener { focusChange ->
when (focusChange) {
AudioManager.AUDIOFOCUS_LOSS -> {
// Permanent loss of audio focus
}
AudioManager.AUDIOFOCUS_LOSS_TRANSIENT -> {
// Pause playback
}
AudioManager.AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK -> {
// Lower the volume, keep playing
}
AudioManager.AUDIOFOCUS_GAIN -> {
// Your app has been granted audio focus again
// Raise volume to normal, restart playback if necessary
}
}
}
}
fun cancel(){
this.enable=false
}
fun enable(){
this.enable=true
}
fun check(): Boolean {
return this.enable
}
fun setNextMediaForMediaPlayer(player: MediaPlayer) {
player.setOnCompletionListener { mp ->
var mp = mp
if(!enable){
mp.release()
audioManager.abandonAudioFocus(afChangeListener)
}
else{
if (soundIDs.size > idx) {
mp.release()
mp = MediaPlayer.create(context, soundIDs[idx])
setNextMediaForMediaPlayer(mp)
mp.start()
idx += 1
}else{
mp.release()
audioManager.abandonAudioFocus(afChangeListener)
}
}
}
}
@SuppressLint("ServiceCast")
override fun doInBackground(vararg params: Void?): Void? {
try {
// Request audio focus for playback
val result: Int = audioManager.requestAudioFocus(
afChangeListener,
// Use the music stream.
AudioManager.STREAM_MUSIC,
AudioManager.AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK
)
if (result == AudioManager.AUDIOFOCUS_REQUEST_GRANTED) {
// Start playback
mediaPlayer.start()
}
} catch (e: IllegalArgumentException) {
Log.e(LOG_TAG, "", e)
} catch (e: SecurityException) {
Log.e(LOG_TAG, "", e)
} catch (e: IllegalStateException) {
Log.e(LOG_TAG, "", e)
}
return null
}
companion object {
private val LOG_TAG = PlayMedia::class.java.simpleName
}
}
Есть Ошибка out out: E / Watchdog:! @ Syn c 11929