Asyn c Задача ExecuteOnExecutor Медленная - PullRequest
0 голосов
/ 16 апреля 2020

Недавно я создал приложение для очередей, я использую 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...