違いは何だActivity.runOnUiThreadとはView.post、誰かが、説明してくださいだろうか?
違いは何だActivity.runOnUiThreadとはView.post、誰かが、説明してくださいだろうか?
回答:
実際の違いはありView.postませんが、アクティビティに直接アクセスできない場合に役立ちます。
どちらの場合も、UIスレッド上にない場合、Handler#post(Runnable)バックグラウンドで呼び出されます。
CommonsWareがコメントで述べたように、2つの間に違いがあります-UiスレッドでActivity#runOnUiThread呼び出されると、runメソッドを直接呼び出しますが、キューにView#postをポストrunnableします(たとえばを呼び出しますHandler#post)
IMOの重要な点は、両方の目標が同じであり、それを使用する誰にとっても、違いはないはずです(実装は将来変更される可能性があります)。
runOnUiThread()は、現在のスレッドを確認し、Runnableたまたまメインアプリケーションスレッドにいる場合に、を実行することです。どのスレッドが呼び出されても、post()常にをRunnableキューに入れます。
runOnUiThread()現在のスレッドをチェックし、たまたまメインアプリケーションスレッド上にいる場合はRunnable即座に実行する」と強調しました(強調を追加)。「これは、UIスレッドに現在存在するものはすべて無視され、これが最優先されることを意味しますか?」- 「これまでどのようなUIスレッド上で、現在では」あるコール。runOnUiThread()
Activity.runOnUiThreadとview.post()のもう1つの違いは、ビューがウィンドウにアタッチされた後で、view.post()のrunnableが呼び出されることです。
ほとんどの状況のために許容可能であり、ほとんどの部分は、彼らは互換性がありますが、彼らはどちらのある微妙に異なります。もちろん、最大の違いは、1つのから入手可能であるということであるActivityから、その他View。それらの間には多くの重複がありActivityますが、時には、あなたはにアクセスできずView、時にはViewあなたはにアクセスできませんActivity。
私が遭遇したエッジケースの1つは、別のSOの質問への回答でView.post述べましたView.post:がウィンドウにアタッチされている場合、別のスレッドからView.postのみ機能しViewます。これが問題になることはめったにありRunnableませんが、特にView.postのonCreateメソッドを呼び出す場合は、が実行されないことがありますActivity。代替案は、Handler.post何であるかActivity.runOnUiThreadをView.post使用して、とにかくカバーの下で使用することです。
(正確さのために編集、「別のスレッドから」を追加)
onCreate()も失敗しますか?その場合は、Handler提供者に投稿されるViewRootと思います。