2020年の記事ハンドラの集計知識アンドロイドAndroidの一部

 

1.ハンドラとは何ですか?

  ハンドラは、メッセージとRunnableオブジェクトのメッセージキューにより送信され、処理することができ、対応するスレッドに関連付けられています。通常、我々はそれが非同期のメカニズムだと思います。

  。対応するメッセージのRunnableを作り、いくつかの時点で、将来的に治療に対応することができます。

  B。私は、時間のかかる操作は、メインスレッドで完成されたUIを更新する作業をできるように、サブスレッドで完了し、子スレッドとメインスレッド間の通信はハンドラによって行われるようにしたいです。

使用する2.Handler

  ハンドラは、非同期のメカニズム多くの方法を提供しますが、我々は掲載し、一般的に用いられている方法のsendMessageシリーズは、我々はハンドラがそれを提供してコンストラクタを見てみましょう:

  • ハンドラ():現在のスレッドのルーパーと、このハンドラのデフォルトコンストラクタ。
  • ハンドラ(Handler.Callbackコールバック):現在のスレッドルーパーため、このハンドラのコンストラクタ、とは、あなたがメッセージを処理できるコールバックインタフェースを、受け入れます。
  • ハンドラ(ルーパールーパー):ルーパーデフォルトの代わりに供給を使用。
  • ハンドラ(ルーパールーパー、Handler.Callbackコールバック):使用ルーパーは、デフォルトの代わりに提供するのではなく、メッセージを処理するコールバックインタフェースを受け入れます。

  次は、我々はそれをハンドラを提供するために、さまざまな方法を見てみましょう:

  • ポスト(RunnableをR):メッセージ・キューを追加するためのRunnable rをリード。
  • postAtTime(RunnableをR、長いuptimeMillis):Runnableをので、メッセージキューに追加r及びuptimeMillis。
  • postDelayed(RunnableをR、長いdelayMillis):Runnableをrは、メッセージキューを作るために追加され、実行指定した時間が経過します。
  • removeCallbacks(RunnableをR):メッセージキューに実行可能なすべてのメッセージを削除したRunnableタスク。
  • removeMessages(INT何):メッセージのタスクの「何」である何フィールドメッセージキューのメッセージオブジェクトを削除します。
  • sendEmptyMessage(INT何):空のメッセージオブジェクト、メッセージとどのような空の設定値を送信します。
  • sendEmptyMessageAtTime(intは何、長いuptimeMillis):特定の時間に配信される値だけを含むメッセージを送信します。
  • (int型どのような、長いdelayMillis)sendEmptyMessageDelayed:のみ指定された時間間隔の後に配信される値が含まれていることをメッセージを送信します。
  • sendMessage(メッセージmsg):現在の時間の前に、メッセージのメッセージキューの最後にプッシュし、保留中のすべてのメッセージが完了しました。
  • sendMessageAtTime(メッセージmsg、長いuptimeMillis):(ミリ秒単位)uptimeMillis前に前に、絶対的な時間内にすべての保留中のメッセージのメッセージキューにメッセージを入れました。
  • sendMessageDelayed(メッセージmsg、長いdelayMillis):前に、すべての保留中のメッセージ(現在の時刻+ delayMillis)、メッセージキューへのメッセージの後。

内部実装のメカニズム3.Handler

  インタビューは、ハンドラがちょうどインタビューにだけではなく、まだかなり大きい可能性の原則を聞くと、私たちは原則ハンドラを見てする必要がある場合は、少なくとも、我々は我々が送ったことを知って、そして我々の目的のために使用するハンドラは、非常に良いですUIスレッドにメッセージを送信するためにどのような問題が発生したとき、私たちは、問題が発生した場所をほんの少しは知っているだろうに分析し、次の実装原則ハンドラメカニズムを導入するために、あまりゴシップが引っ張られ、よく、それを修正します。
  ハンドラのメカニズムは、主に4つの部分から構成され、非同期メッセージメカニズム、呼び出すことができます。メッセージ、ハンドラー、メッセージキュー、ルーパーを 、 私たちはメッセージハンドラと、四人の我々の理解の次の焦点へのアクセス権を持っていることの上に:

1.Message
  メッセージは、異なるスレッド間でデータを交換するために、内部に少量の情報を運ぶことができるスレッドの間を通過するメッセージです。ARG1とARG2のメッセージは、データを運ぶことができるオブジェクトobjを使ってint型のデータ型を運ぶことができます。

2.Handler
  ハンドラハンドラ名があれば、メッセージは子スレッド内のオブジェクトメッセージを送信するために使用されたとして、意味あることを示唆している、メッセージの件名、メッセージ、メッセージのMessageオブジェクトを送信するコールsendMessageメソッドのスレッド、およびメッセージを処理するUIスレッドは地面のシリーズを介して送信されますハンドラのhandleMessageメソッドに送信することが最終的に除去した後、最終的なメッセージオブジェクトは、メッセージのhandleMessageプロセスで処理されます。

3.MessageQueue
  メッセージキューの意味がある限り、すべてのメッセージを格納するために使用されるハンドラによってオーバー送信され、メッセージキューです。メッセージのこの部分は、処理されるのを待って、そのキューのメッセージに格納されていたであろう。各スレッドは、メッセージキューのオブジェクトを持っているこれらの言葉を覚えているでしょう。事実から分かるように、文字通り、データ構造の基礎となるメッセージキューは、キューであり、キューは、メッセージ・オブジェクトが格納されます。

4.Looper
  ルーパーが呼ルーパーループ()メソッドの後に各スレッドメッセージキュー家政婦であるMesssageQueue、これらのメッセージは、ルーパーを除去されるたびに、、、およびメッセージの存在下で無限ループに入りますそして、のhandleMessage(方法)のハンドラに渡します。各スレッドルーパーは、1つのオブジェクトのみです。

  上記ハンドラ機構の4つの部材学び、我々は再びその理由のアイデアに来る:最初のUIで、それは匿名内部クラスとオブジェクトのハンドラーのインスタンスを生成したカスタムクラスであるかどうか、我々はのhandleMessageに必要な、我々はオブジェクトのハンドラのインスタンスを作成し、スレッド私たちは、ロジックを受け入れるのhandleMessageメソッドに書き換え方法私たちは子スレッドを作成し、その後、パラメータMSGを通じてUIIスレッド後にプロセスメッセージを書き込むことができ、子スレッドがUIを更新する必要がある、新しいメッセージオブジェクトを作成し、そしてメッセージ等メッセージオブジェクトメッセージ、例えばARG1、ARG2、OBJ内に記録されたデータ、およびメッセージ・インスタンス・オブジェクトは、この場合、メッセージが処理されるのを待っているメッセージキューに格納され、オブジェクトの前述ハンドラインスタンスによってsendMessgeメソッドを呼び出し送出ルーパーは、ハンドラのhandleMessageメソッドにメッセージを渡すDispatchMessageを常にコールバックメソッドにより、取り出されたメッセージをメッセージキューに存在する場合にメッセージキュー家政婦、前述のメッセージは、最終的にメッセージキュールーパーから除去される方法のhandleMessageに渡されます 、それは最終的に処理されます。これは、メカニズムハンドラワークフロー全体で、どのように?分かりますか?あなたがよく知っているだろう、次のチャートを検討してください。

ハンドラのメカニズムの作業フロー・チャート

ソースコードの観点から原則を理解するためにハンドラ:http://blog.csdn.net/u012827296/article/details/51236614

メモリリークとソリューション原因4.Handler

理由:匿名引用外部クラスによって保持された非静的内部クラス、外部活動に結果を解放することはできません。

溶液:内部ハンドラは外部弱参照を保持し、代わりに静的内部クラスのハンドラ、onDestory(の活性removeCallbackハンドラ()メソッドを呼び出す)です。

http://blog.csdn.net/javazejian/article/details/50839443

5.どのようにハンドラは、子と、子スレッドのスレッド間の通信が可能になりますか?

  今日のインタビューは、ハンドラは基本的にインタビュアーの多くは、それがスムーズに言うだろうが、あなたが面接を強調したい場合は、その後、我々はハンドラーのは非常に徹底的に理解する必要があり、我々は通常、コードはメインスレッドとサブスレッド非同期通信です、その子と子スレッドのスレッドができるとの間に?もちろん、あなたはできますが、我々はあなたが著者ハンドラソースコード解析部を見ることができるルーパー、綿密な調査Hanlderについて十分に知っておく必要があります。だから我々は、スレッドAとサブBとの間に子スレッドハンドラの通信を必要とし、Aは、子スレッドBにメッセージを送信し、子スレッドがある場合は、我々は何をすべきでしょうか?

public class MainActivity extends AppCompatActivity { private Handler threadHandler; [@Override](https://my.oschina.net/u/1162528) protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } class ThreadA extends Thread{ [@Override](https://my.oschina.net/u/1162528) public void run() { super.run(); Looper.prepare(); threadHandler = new Handler(){ [@Override](https://my.oschina.net/u/1162528) public void handleMessage(Message msg) { super.handleMessage(msg); //收到来自于ThreadB的消息,注意这里运行在ThreadA线程中 //...... } }; Looper.loop(); } } class ThreadB extends Thread{ [@Override](https://my.oschina.net/u/1162528) public void run() { super.run(); Looper looper = Looper.myLooper(); Message message = new Message(); message.obj = "ThreadB发送消息到ThreadA"; //...... threadHandler.sendMessage(message); } } } 

  私は、このコードはおそらくよくないです書いたが、それは問題で、私たちは素晴らしいニュースの世論調査である、最初にあなたがスレッドAでルーパーを準備する必要があり、ThreadBスレッドAにメッセージを送信する方法を、いくつかの重要な分野を学習する必要はありません。スレッドA Handlerオブジェクトを生成することであるその後、ハンドラーが理解しやすいメッセージを送信する準備ができてメッセージハンドラを送信する準備ができて、そしてバトラー、その後、どのようにそれを行うにはルーパーを準備?スレッドA Looper.prepareに呼び出されます()、その後、Looper.loop(呼び出す)ことが、なぜそれを呼び出すことができますか?私たちは、そのようなコードは、メインUIスレッドでそれを呼ばれる方法が表示されないのですか?実際に、彼らは、私たちは非常に身近なハンドラメカニズムへ順に、私たちは私がThreadBスレッドを作るためにここにコードを書くように、スレッドAスレッドに送信し、なぜ私たちが知っているように、研究調査ハンドラのソースコードに必要な、見ていないソースの内部と呼ばれていますサブサブスレッドスレッドハンドラオブジェクト非同期通信を達成するようにメッセージ。

6.Androidネイティブパッケージのホイールベースのハンドラ

AsyncTask
HandlerThread
IntentService

(底角)から解像度の7.Handler原理

まとめること

インタビューの質問(自分自身の学習を検出する方法)

  • 1.子供はUIがそれをスレッド更新してはいけませんか?(スクール&インターンシップ募集)
  • 原理は、ハンドラの(学校のリクルート&インターンシップ)について教えてください2。
  • メモリリークに3.Handlerリードはどのように解決するのですか?
  • 4.ハンドラを使用する方法は、子スレッドとサブスレッド間通信を聞かせて?
  • 5.あなたはハンドラの設計原理について私を与えることができますか?
  • 原則6.HandlerThread&&使用方法のシナリオとは何ですか?
  • 何7.IdleHandlerこと?
  • 8.あなたが複数のハンドラ、ハンドラとルーパーとのスレッド対応を作成できますか?
  • 9.なぜAndroidのシステムは、子スレッドのUIを訪問することは推奨されませんか?
  • 10.Looperなぜ、アプリケーションが立ち往生無限ループにつながりませんか?
  • 変更キュー11. postDealyハンドラのメッセージ?
  • 12.直接新しいにおけるそれのうちの子スレッドハンドラはできますか?
  • 13.Message&オブジェクトが作成された方法との違いは何ですか?
  • 14.ANRとハンドラは、任意のリンクを存在しますか?
  • ルーパールーパーメインスレッドと子スレッド15の違いは何ですか?
  • 16.なぜハンドラクロスプロセス間通信について話すことはできませんか?
  • 17.Handlerメッセージ遅延がどのように達成することですか?
  • 18.メッセージの障壁は何ですか?
  • 19.新しいメインスレッドを仮定し、ハンドラAハンドラB及びCハンドラは、サブスレッドがあり、子スレッドハンドラCによって送信されたメッセージを、次いで、ハンドラAハンドラBはそれを受け取ることができますか?なぜ?

注:記事の最後に自身が要約からの質問に直面している、またはアンサー交換を見つけたい作者、スタート著者GitHubのプロジェクトAndroidFaceInterview

更新:2020年1月15日

推奨:会社のロゴデザイン

おすすめ

転載: www.cnblogs.com/1994jinnan/p/12644204.html
おすすめ