0

У меня есть MediaPlayer, работающий в службе. Служба отправляет трансляцию активности с текущей продолжительностью песни каждые 250 мс для обновления SeekBar в действии.BroadcastReceiver делает анимацию лаг

seekIntent = new Intent("com.someaction"); 

private Runnable sendUpdateToUI = new Runnable() { 
    public void run() 
    { 
     LogMediaPosition(); 
     handler.postDelayed(this, 250); 
    } 
}; 

private void LogMediaPosition() 
{ 
    mediaPosition = mMediaPlayer.getCurrentPosition(); 
    mediaMax = mMediaPlayer.getDuration(); 
    seekIntent.putExtra("counter", mediaPosition); 
    seekIntent.putExtra("mediamax", mediaMax); 
    sendBroadcast(seekIntent); 
} 

и в деятельности

registerReceiver(broadcastReceiver, new IntentFilter("com.someaction"));

private BroadcastReceiver broadcastReceiver = new BroadcastReceiver() { 
    @Override 
    public void onReceive(Context context, Intent intent) 
    { 
     updateUI(intent); 
    }  
}; 

private void updateUI(Intent intent) 
{ 
    int seekProgress = intent.getIntExtra("counter", 0); 
    int seekMax = intent.getIntExtra("mediamax", 0); 

    songCurrentDurationLabel.setText(utils.millisecondsToTimer(seekProgress)); 
    songProgressBar.setMax(seekMax); 
    songProgressBar.setProgress(seekProgress); 
} 

Активность также имеет простой TranslateAnimation.

TranslateAnimation translate = new TranslateAnimation(Animation.RELATIVE_TO_PARENT, 0, Animation.RELATIVE_TO_PARENT, 0, Animation.RELATIVE_TO_SELF, -1.0f, Animation.RELATIVE_TO_SELF, 0); 
translate.setDuration(500); 
translate.setFillAfter(true); 
translate.setFillEnabled(true); 
btnName.startAnimation(translate); 

Когда регистратор зарегистрирован, в TranslateAnimation есть очень небольшое, но заметное отставание. Но если я прокомментирую строку registerReceiver() в действии, то есть не позволяя приемнику регистрироваться, не обновляя SeekBar, TranslateAnimation работает отлично.

Любое предложение, как это можно решить, чтобы получить плавную анимацию даже после регистрации получателя?

ответ

0

Радиовещательный приемник работает в потоке пользовательского интерфейса, если вы специально не попросите его сделать это, как описано here. Вы не должны делать много вычислений в методе onReceive() (и иметь в виду 10-секундный предел).

Возможно, вам стоит изучить, как вы сообщаете ProgressBar для обновления, а также изучите, что вы делаете с помощью TranslateAnimation.

+0

Я также добавил код для TranslateAnimation к вопросу. Если бы вы могли сказать, посмотрев код, как я могу его улучшить? –

Смежные вопросы