我在服务中运行 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运行得非常流畅。
任何建议,即使在收件人注册后,如何才能解决这个问题?
答案 0 :(得分:0)
广播接收器在UI线程上运行,除非您明确要求它执行此操作,如here所述。你不应该在onReceive()方法中做很多计算(并记住10秒的时间限制)。
您应该检查一下如何通知ProgressBar进行更新,并检查您使用TranslateAnimation进行的操作。