【问题标题】:Android - wait for runnable to finishAndroid - 等待可运行完成
【发布时间】:2016-07-03 19:17:24
【问题描述】:

我一个字母一个字母地给 textview 写文本。只有在显示整个文本后,我才想开始运行进度条。我想我可以通过通知/等待来实现它,但我不知道如何。有什么帮助吗?

我创建了 Typewriter 扩展 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);
}

然后我在主要活动中使用它:

Typewriter writer = (Typewriter)findViewById(R.id.typewriter);
writer.animateText("Lorem ipsum dolor sit amet");
//wait until animation finishes to perform further actions

【问题讨论】:

  • 使用 Future 对象?
  • 我该怎么做?我对此一无所知,我宁愿先学习如何使用基本的 runnable 来做到这一点。
  • @suue 使用 Thread 类中的 join 方法执行此操作,请参阅此 tutorialthis one
  • @rahmatwaisi 但我没有明确地创建一个新线程;我执行使用可运行对象的 animateText 方法。在这种情况下我该怎么做?

标签: java android runnable android-handler


【解决方案1】:

由于我的两个操作都在 UI 线程上运行,我没有找到任何同步解决方案。相反,我将第二个动作推迟到打印所有字母所需的时间:

Handler handler = new Handler();
handler.postDelayed(new Runnable() {
  public void run() {
    animation.start();
  }
  }, timeNeeded);

【讨论】:

    【解决方案2】:

    我确实喜欢在 Kotlin 中使用 Coroutine。

    val handler = Handler()
    var isWaitingHandler = true
    GlobalScope.async {
        handler.post {
            // handler does something.
            isWaitingHandler = false    
        }
    
        while(isWaitingHandler) {
            delay(50)
        }
        Unit
    }.await()
    

    这不是我写的,但我认为会起作用。

    【讨论】:

      猜你喜欢
      • 2020-04-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-01-03
      • 1970-01-01
      相关资源
      最近更新 更多