在我的UtteranceProgressListener中,我覆盖了onRangeStart
,但没有被调用。
@Override
public void onRangeStart(String utteranceId, int start, int end, int frame) {
super.onRangeStart(utteranceId, start, end, frame);
Spannable wordToSpan = new SpannableString(smartOcrDisplayTextLeft.getText());
wordToSpan.setSpan(new ForegroundColorSpan(Color.GREEN), start, end, Spanned.SPAN_INCLUSIVE_INCLUSIVE);
smartOcrDisplayTextLeft.setText(wordToSpan);
}
答案 0 :(得分:1)
根据UtteranceProgressListener docs,“可以从多个线程中调用此方法中指定的回调。”
要验证这一点,您可以添加
boolean wasCalledFromBackgroundThread = (Thread.currentThread().getId() != 1);
Log.i("XXX", "was onRangeStart() called on a background thread? : " + wasCalledFromBackgroundThread);
到onRangeStart()方法主体。
根据我的经验,在后台线程上调用它们的频率更高。
因此,像这样围绕UI操作会更安全:
runOnUiThread(new Runnable() {
@Override
public void run() {
Spannable wordToSpan = new SpannableString(smartOcrDisplayTextLeft.getText());
wordToSpan.setSpan(new ForegroundColorSpan(Color.GREEN), start, end, Spanned.SPAN_INCLUSIVE_INCLUSIVE);
smartOcrDisplayTextLeft.setText(wordToSpan);
}
});