web-dev-qa-db-ja.com

メインスレッドのView.postDelayed()とHandler.postDelayed()の違いは何ですか?

Handler.postDelayed(Runnable r, long delayMillis)のドキュメントによると:

Runnable rをメッセージキューに追加し、指定された時間が経過した後に実行します。ランナブルは、このハンドラーが接続されているスレッドで実行されます。

一方、View.postDelayed(Runnable action, long delayMillis)

Runnableをメッセージキューに追加し、指定された時間が経過した後に実行します。ランナブルは、ユーザーインターフェイススレッドで実行されます。

メインスレッドから呼び出しているときに2つの間に違いがあるかどうか、特にアクティビティが破棄されているときに違いがあるかどうかを知りたいですか?

私はこれを読みました 記事 内部クラスハンドラーを使用するときにアクティビティをリークする方法について、View.postDelayed()を使用すると同じ問題が発生するかどうか疑問に思いました。

たとえば、foo()が問題を引き起こす可能性がありますか、またはアクティビティの破棄により、Runnable匿名クラスがアクティビティへの参照を保持しているという事実が解決されますか?

public class MyActiviy extends Activity {
    private void foo(View v) {
        v.postDelayed(new Runnable() {
            public void run() {
                // some delayed work
            }
        }, 60000);
        finish();
    }
}
13

ソースから、View.postDelayed()は単に内部ハンドラーでHandler.postDelayed()を使用しているため、違いはありません。

foo()はアクティビティをリークする可能性があるため、この可能性を最小限に抑えるためにView.removeCallbacks()を使用する必要があります。

8
Steve M