BroadcastReceiver使动画滞后

时间:2013-07-24 10:40:38

标签: android android-service android-animation android-mediaplayer android-broadcast

我在服务中运行 MediaPlayer 服务每隔250毫秒向活动发送一个广播,并更新该活动中的SeekBar。

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运行得非常流畅。

任何建议,即使在收件人注册后,如何才能解决这个问题?

1 个答案:

答案 0 :(得分:0)

广播接收器在UI线程上运行,除非您明确要求它执行此操作,如here所述。你不应该在onReceive()方法中做很多计算(并记住10秒的时间限制)。

您应该检查一下如何通知ProgressBar进行更新,并检查您使用TranslateAnimation进行的操作。