【问题标题】:is using CountDownTimer to add styles every few milliseconds a correct approach?使用 CountDownTimer 每隔几毫秒添加一次样式是正确的方法吗?
【发布时间】:2015-05-15 15:48:50
【问题描述】:

我有一个音轨正在播放,音轨中每个单词都有对应的开始时间的单词数组:

HashMap<String, Float> words = new HashMap<>();
words.put("This", 11.258);
words.put("is", 11.733);
words.put("some", 11.733);

我还在 TextView 中显示了此文本。每当音轨中的单词发音时,我都希望突出显示该单词。目前我能想到的唯一解决方案是每隔几毫秒运行一次 CountDownTimer 并突出显示当前播放的单词,如下所示:

 new CountDownTimer(30000, 4) {

     public void onTick(long millisUntilFinished) {
        // remove previos word highlighting
        ...
        // highlight current word
        Spannable spannableText = new SpannableString(tv.getText());
        spannableText.setSpan(new BackgroundColorSpan(Color.LTGRAY), startOffset, endOffset, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
        tv.setText(spannableText);
     }

     public void onFinish() {

     }
  }.start();

这种方法是否可行,或者是否有更好的方法来实现我描述的功能?也许使用 MediaPlayer 的东西?

【问题讨论】:

  • 谢谢,处理程序如何成为更好的方法?
  • 我在下面发布了我的答案:

标签: android


【解决方案1】:

你不必为定时器定义你自己的线程,所以你 回避所有线程管理的问题,让系统来处理。

这里是处理程序的实现:

    //updated the screen when we are testing for connectivity and errors.
private Handler handlerHighlightWords = new Handler() {
    @Override
    public void handleMessage(Message msg) {

                ...
        // highlight current word
        Spannable spannableText = new SpannableString(tv.getText());
        spannableText.setSpan(new BackgroundColorSpan(Color.LTGRAY), startOffset, endOffset, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
        tv.setText(spannableText);
        handlerMessageText.sendEmptyMessageDelayed(0, 1000);
    }
};

    //runnable to to feed to handler.
final Runnable handlerRunnableMessage = new Runnable() {
    public void run() {
        Spannable spannableText = new SpannableString(tv.getText());
        spannableText.setSpan(new BackgroundColorSpan(Color.LTGRAY), startOffset, endOffset, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
        tv.setText(spannableText);


    }
};

然后一旦你点击一个按钮:

handlerMessageText.post(handlerRunnableMessage);

【讨论】:

  • 谢谢!你能解释一下为什么这种方法比使用CountDownTimer 更好吗?我不为CountDownTimer 创建线程,我从主应用程序线程运行它。
  • 我为另一个使用 CountDownTimer 基本代码的项目创建了另一个类。如您所见,倒数计时器也使用了处理程序。 github.com/techartist/SixtySecondYogaFree/blob/master/src/com/…。我认为处理程序是您的应用程序的完美选择 - 我不认为您需要使用倒数计时器。
猜你喜欢
  • 2012-09-09
  • 2019-06-17
  • 1970-01-01
  • 1970-01-01
  • 2020-01-13
  • 2010-12-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多