Android:Activity.runOnUiThreadとView.postの違いは何ですか?


97

回答:


104

実際の違いはありView.postませんが、アクティビティに直接アクセスできない場合に役立ちます。

どちらの場合も、UIスレッド上にない場合、Handler#post(Runnable)バックグラウンドで呼び出されます。

CommonsWareがコメントで述べたように、2つの間に違いがあります-UiスレッドでActivity#runOnUiThread呼び出されると、runメソッドを直接呼び出しますが、キューにView#postをポストrunnableします(たとえばを呼び出しますHandler#post

IMOの重要な点は、両方の目標が同じであり、それを使用する誰にとっても、違いはないはずです(実装は将来変更される可能性があります)。


70
違いの1つrunOnUiThread()は、現在のスレッドを確認し、Runnableたまたまメインアプリケーションスレッドにいる場合に、を実行することです。どのスレッドが呼び出されても、post()常にをRunnableキューに入れます。
CommonsWare、2012年

ありがとうございます。あなたの説明と@CommonsWareのコメントに基づいて、違いを確認できるようになりました。
Alexander Kulyakhtin

4
@Ashwin:「runOnUiThread()はRunnableをすぐに実行すると言っていました」-いいえ、私はしませんでした。コメントをもう一度読んでください。私は「runOnUiThread()現在のスレッドをチェックし、たまたまメインアプリケーションスレッド上にいる場合はRunnable即座に実行する」と強調しました(強調を追加)。「これは、UIスレッドに現在存在するものはすべて無視され、これが最優先されることを意味しますか?」- 「これまでどのようなUIスレッド上で、現在では」あるコール。runOnUiThread()
CommonsWare

1
@ barn.gumbl:この場合、ソースを確認しました。
CommonsWare 2014

1
そこの違いは。ウィンドウにアタッチされていないビューに投稿しても何も起こりません。大きな違いではありませんが、これは微妙なバグを引き起こす可能性があり、違いが存在することに気付いていない場合、ナビゲートするのは非常に面倒です。
dcow 2016年

23

Activity.runOnUiThreadとview.post()のもう1つの違いは、ビューがウィンドウにアタッチされた後で、view.post()のrunnableが呼び出されることです。


どういう意味ですか?見えますか?非表示のビューでまったく呼び出されませんか?
Alexander Kulyakhtin 2014年

あいまいさのアレックスを修正しました。
pareshgoel 14年

5
これは私見の最も重要な違いです。多くの人は、view.post()を使用して、ビューがアタッチされた後に実行する必要があるものを実行します。
ソッティ2015

3
本当じゃない。これは決して真実ではありませんでしたが、ある時点で、View.javaのJavaDocは、「View.postは、ビューがウィンドウにアタッチされている場合、別のスレッドからのみ機能する」と誤って述べていました。これは2012年10月15日に修正されましたが、Androidデベロッパーの心に浸透するまでに時間がかかりました。
Alex Cohn 2016年

この違いの@pareshgoelソース?
apostleofzion

17

ほとんどの状況のために許容可能であり、ほとんどの部分は、彼らは互換性がありますが、彼らはどちらのある微妙に異なります。もちろん、最大の違いは、1つのから入手可能であるということであるActivityから、その他View。それらの間には多くの重複がありActivityますが、時には、あなたはにアクセスできずView、時にはViewあなたはにアクセスできませんActivity

私が遭遇したエッジケースの1つは、別のSOの質問への回答でView.post述べましView.post:がウィンドウにアタッチされている場合、別のスレッドからView.postのみ機能Viewます。これが問題になることはめったにありRunnableませんが、特にView.postonCreateメソッドを呼び出す場合は、が実行されないことがありますActivity。代替案は、Handler.post何であるかActivity.runOnUiThreadView.post使用して、とにかくカバーの下で使用することです。

(正確さのために編集、「別のスレッドから」を追加)


1
未装着の場合onCreate()も失敗しますか?その場合は、Handler提供者に投稿されるViewRootと思います。
イェンス

5
@Jensええ、私はソースをちらっと見ましたが、まだアタッチされていない場合は、後で実行するためにをキューにView.post追加するRunnable必要があります。私はソースを深く掘り下げていませんが、ドキュメントには「このビューがウィンドウにアタッチされている場合にのみ、UIスレッドの外部から呼び出すことができる」と書かれています。したがって、それが現在のスレッドにある場合は、あなたが言ったことは真実であると思います。そうでない場合は、おそらくを飲み込むだけRunnableです。私は確かにそれを私のコードで起こしました。
kabuko

@kabukoありがとうございますあなたの答えは別の点からそれを示しています。どのように私は1つ以上の答えを受け入れることができませんメタフォーラムに
対処する

3
本当じゃない。これは決して真実ではありませんでしたが、ある時点で、View.javaのJavaDocは、「View.postは、ビューがウィンドウにアタッチされている場合、別のスレッドからのみ機能する」と誤って述べていました。これは2012年10月15日に修正されましたが、Androidデベロッパーの心に浸透するまでに時間がかかりました。
Alex Cohn 2016年

0

もう1つの違いpostは、ビューごとです。runOnUiThreadアクティビティごとです。

つまり、独自のトラッキングコードやフィルタリングコードがなくても、(将来的には)view.getQueue/ activity.getQueueを実行して、希望どおりの結果を得ることができます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.