Android - 等待可运行完成
Android - wait for runnable to finish
我一个字母一个字母地将文本写入textview。只有在显示整个文本后我才想启动 运行 进度条。我想我可以用 notify/wait 实现它,但我不知道如何实现。有帮助吗?
我创建了 Typewriter
class 扩展了 Textview
:
private Handler mHandler = new Handler();
public Runnable characterAdder = new Runnable() {
@Override
public void run() {
setText(mText.subSequence(0, mIndex++));
if (mIndex <= mText.length()) {
mHandler.postDelayed(characterAdder, mDelay);
}
}
};
public void animateText(CharSequence text) {
mText = text;
mIndex = 0;
setText("");
mHandler.removeCallbacks(characterAdder);
mHandler.postDelayed(characterAdder, mDelay);
}
然后我在 Main activity:
中使用它
Typewriter writer = (Typewriter)findViewById(R.id.typewriter);
writer.animateText("Lorem ipsum dolor sit amet");
//wait until animation finishes to perform further actions
由于我在 UI 线程上的两个操作 运行 我没有找到任何同步解决方案。相反,我将第二个动作推迟到打印所有字母所需的时间:
Handler handler = new Handler();
handler.postDelayed(new Runnable() {
public void run() {
animation.start();
}
}, timeNeeded);
我喜欢在 Kotlin 中使用协程。
val handler = Handler()
var isWaitingHandler = true
GlobalScope.async {
handler.post {
// handler does something.
isWaitingHandler = false
}
while(isWaitingHandler) {
delay(50)
}
Unit
}.await()
这不是我写的,但我认为可以。
我一个字母一个字母地将文本写入textview。只有在显示整个文本后我才想启动 运行 进度条。我想我可以用 notify/wait 实现它,但我不知道如何实现。有帮助吗?
我创建了 Typewriter
class 扩展了 Textview
:
private Handler mHandler = new Handler();
public Runnable characterAdder = new Runnable() {
@Override
public void run() {
setText(mText.subSequence(0, mIndex++));
if (mIndex <= mText.length()) {
mHandler.postDelayed(characterAdder, mDelay);
}
}
};
public void animateText(CharSequence text) {
mText = text;
mIndex = 0;
setText("");
mHandler.removeCallbacks(characterAdder);
mHandler.postDelayed(characterAdder, mDelay);
}
然后我在 Main activity:
中使用它Typewriter writer = (Typewriter)findViewById(R.id.typewriter);
writer.animateText("Lorem ipsum dolor sit amet");
//wait until animation finishes to perform further actions
由于我在 UI 线程上的两个操作 运行 我没有找到任何同步解决方案。相反,我将第二个动作推迟到打印所有字母所需的时间:
Handler handler = new Handler();
handler.postDelayed(new Runnable() {
public void run() {
animation.start();
}
}, timeNeeded);
我喜欢在 Kotlin 中使用协程。
val handler = Handler()
var isWaitingHandler = true
GlobalScope.async {
handler.post {
// handler does something.
isWaitingHandler = false
}
while(isWaitingHandler) {
delay(50)
}
Unit
}.await()
这不是我写的,但我认为可以。