序文
採用シーズンが到来した今、この記事は有名なインターネット企業の面接官の面接方法と経験を共有することを目的としています。この記事を読むことで、プログラマーに異なる面接の経験と感情を与え、面接の精神をリラックスさせ、積極的に準備できることを願っています。戦いのために!
インタビュアー:UIスレッドとは何ですか?
A:UIが配置されているスレッドを更新するために使用されます
インタビュアー:もっと話す
A:UIは単一のスレッドで更新されます。複数のスレッドでUIを更新できる場合は、UIスレッドであるかどうかは関係ありません。単一スレッドの利点は、UIのどこでもロックする必要がないことです。 UIフレームワーク、およびスレッド同期は簡単で効果的に記述できます。
インタビュアー:あなたが言及したこのUIスレッド、それはどのスレッドですか?メインスレッドですか?
A:Activityを例にとると、Activityで時間のかかる操作を非同期で終了したら、Activity.runOnUiThreadメソッドを呼び出してUIを更新し、UIスレッドで実行できます。そうすれば、UIスレッドがどのスレッドであるかが自然にわかります。この方法を見ることによって。
public final void runOnUiThread(Runnable action) {
if (Thread.currentThread() != mUiThread) {
mHandler.post(action);
} else {
action.run();
}
}
このメソッドは、現在メインスレッドにあるか、mHandlerを介して実行するためにメインスレッドにスローされるかを判別します。このmHandlerのアクティビティは、引数なしのコンストラクターnew Handler()
によって作成されて一緒に作成される時間内のグローバル変数です。
パラメータがないため、作成時に使用されるスレッドと、HandlerのLooperが使用するスレッド。アクティビティはアプリケーションのメインスレッドで作成されるため、mHandler.postが実行されるスレッドもメインスレッドです。runOnUiThreadメソッドで、最初にUIスレッドにあるかどうかを確認します。このmUiThreadはいつ割り当てられますか?答えはまだActivityソースコードにあります。
final void attach(Context context, ...) {
...省略无关代码
mUiThread = Thread.currentThread();
}
Activity.attachメソッドでは、現在のスレッドをmUiThreadに割り当てます。現在のスレッドはどのような種類のスレッドですか?これはメインスレッドでもあります。アクティビティの作成とアタッチが両方ともメインスレッドである理由については、別の話です。前の分析から、アクティビティの場合、UIスレッドがメインスレッドであることがわかります。
インタビュアー:あなたの結論は、UIスレッドがメインスレッドであるということですか?
A:これはあなたが言ったことです。開発中に間違いを犯すことはできませんが、十分に正確ではないことを忘れないでください。子スレッドのUIを更新すると、例外がスローされます
ViewRootImpl$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.
一般的な考え方は、ビュー階層を最初に作成したスレッドのみがビューにアクセスできるというものです。これは、ViewRootImplが作成されたスレッドを指します。厳密に言えば、このスレッドは必ずしもメインスレッドである必要はありません。この時点で、View.postメソッドを読み取ることで同じ結論を得ることができます。したがって、Viewの場合、UIスレッドはViewRootImplが作成されたスレッドであり、アクティビティのDecorViewに対応するViewRootImplがメインスレッドに作成されます。
インタビュアー:このViewRootImplはいつ作成されましたか
A:アクティビティが作成された後、アプリケーションのメインスレッドはActivityThread.handleResumeActivityを呼び出します。このメソッドは、この時点で作成されたViewRootImplであるWindowMangerにアクティビティのDecorViewを追加します。
インタビュアー:ビューを非同期スレッドで更新できますか?
A:先ほど、ViewRootImplによって作成されたスレッドがビューに触れることができる限り、WindowManger.addViewが作成されると、ViewRootImplが作成されるため、子スレッドでWindowManger.addViewを呼び出すだけで済みます。この子スレッドで更新されたこの子スレッドは、このビューのUIスレッドです。
インタビュアー:さて、他のことについて話しましょう
文末
Androidのコアナレッジポイントのいくつかと、最新のインタビューの質問、ナレッジブレインマップ、ビデオデータ分析のいくつかを要約しました。
困っている小さなパートナーのプライベートメッセージ[学習]私はあなたと無料で共有します、そして私たちが将来一緒に進むことができることを願っています。(継続的なサポートに感謝します。必要な場合は、自分で入手してください)
リンクを直接クリックして受け取ることもできます!
Android学習PDF +アーキテクチャビデオ+インタビュードキュメント+ソースノート
一目でいくつかの情報:
- 330ページのPDFAndroid学習コアノート(8セクションを含む)
- Android学習システム対応動画
- Androidの高度なシステムに対応する学習教材
- Android BATインタビューの質問(分析)
対応する学習教材**
[外部リンク画像が転送されています...(img-n0iPM5Ph-1610954315224)]
- Android BATインタビューの質問(分析)