2019ハンドラの中間レベルのAndroid開発者のインタビューの回答

注:答えを参照して、実際の開発は異なりますのでさらに恐れてあなたを誤解させるので、彼らはまだ質問自体が理解して答える直面しています。!インタビュアーのための深い知識問題点は言及再開しますので、バックより多くの理解を答えていません。

ハンドラ

1.メッセージハンドラは、役割について話しますか?要素は何ですか?プロセスとは何ですか?

参考答え:

スレッド間通信を担当し、メインスレッドが時間のかかる操作を行うことができないので、これは、子は、UIスレッドを更新することはできませんので、子スレッドは、いつUI、操作を消費した後、メインスレッドへのハンドラによって、スイッチの動作に関連するUI更新する必要があるとき実行インチ

具体的には四つの要素に分割
  • メッセージ(メッセージ):メッセージは、メッセージが生成されたハードウェア生成されたメッセージのメッセージ(例えば、ボタン、タッチ)とソフトウェアに分割され、送信される必要があります。
  • メッセージキュー(メッセージキュー):、メッセージの保存と管理を担当するメッセージを管理する責任は、ハンドラによってオーバー送られます。自動的に読むメッセージを削除し、単一のリストを維持するには、挿入および削除に利点があります。そのnext()メソッドで無限ループであり、メッセージがあるかどうかを判断していき、メッセージが返されて除去されます
  • ハンドラ(メッセージプロセッサ):メッセージの処理および送信のために責任があります。様々なイベントメッセージに送信されたメッセージ(Handler.sendMessage())及び対応するイベントメッセージを処理のメインプール(Handler.handleMessage())、FIFO、単一のリストの内部構造に従って行わ。
  • ルーパー(ニュース・プール):関連するスレッドとメッセージ配信の責任は、ルーパーの作成がメッセージキュー、コール・ループ()メソッドを作成しますメッセージキューのメッセージ、分散ハンドラからスレッドで取得するときに継続するメッセージループスタート、次のメッセージキュー()メソッドでの治療、または閉塞のニュースがあった場合にメッセージキューは、次の()メソッドを呼び出します。ルーパーのは()を終了すると)呼び出しは(のメッセージキューを終了呼び出される次回のこの時間は、()はnullを返し、その後、ループ()メソッドは、出口に従います。
次のように具体的な手順は、

2019ハンドラの中間レベルのAndroid開発者のインタビューの回答

  • メインスレッドの作成はルーパーでなく、ルーパー内部のメッセージキューの作成で作成するとき。場合は、レコードキーハンドラルーパー現在のスレッドから取り出し、メッセージキュールーパーオブジェクトによって得られ、その後、子スレッドMessageQueue.enqueueMessageでメッセージキューにメッセージハンドラを追加します。
  • オープンLooper.loopメッセージをループ()を連続的にポーリングコールMessageQueue.next()、対応するメッセージハンドラを取得するとHandler.dispatchMessage、Handler.handlerMessage最終呼処理メッセージに通しました。

2.スレッドは、ルーパーと、複数のハンドラ、ハンドラとの対応を作成することができますか?

参考答え:

  • スレッドは、ルーパー、MessageQueenを持つことができ、複数のハンドラを持つことができます
  • スレッドベースでは、その大小関係は次のとおりです。スレッド(1):ルーパー(1):メッセージキュー(1):ハンドラ(N)

3.ソフト参照は弱いとの違いを引用しました

参考答え:

  • ソフト参照(SoftReference)は:オブジェクトのみソフト参照がある場合、十分なメモリ空間は、ガベージコレクタは、それを再利用しない場合、メモリ空間が不足している場合、それは、これらのオブジェクトのメモリを解放します。限り、ガベージコレクタがそれを再利用しないように、オブジェクトは、プログラムによって使用されていてもよいです。
  • 弱参照(弱い参照):オブジェクトのみ弱参照は、ガベージコレクタスレッドスキャンプロセスがある場合、オブジェクトのみ弱参照を発見したら、関係なく、現在のメモリ空間の十分か否かで、そのメモリを解放します。
  • 弱い参照オブジェクトが、より短いライフサイクルを有する任意の時点で回収することができる2つの基本的な違いがあることです。オブジェクトは時間が必要なだけのメモリ回復をしただけで唯一のソフト参照され、十分なメモリでは、一般的に回復されていません。

2019ハンドラの中間レベルのAndroid開発者のインタビューの回答

4.Handlerのメモリリークが発生する理由と最善の解決策

参考解答:
リーク理由

  • Handler 允许我们发送延时消息,如果在延时期间用户关闭了 Activity,那么该 Activity 会泄露。 这个泄露是因为 Message 会持有 Handler,而又因为 Java 的特性,内部类会持有外部类,使得 Activity 会被 Handler 持有,这样最终就导致 Activity 泄露。
    解决方案:
  • 将 Handler 定义成静态的内部类,在内部持有Activity的弱引用,并在Acitivity的onDestroy()中调用handler.removeCallbacksAndMessages(null)及时移除所有消息。

5.为什么系统不建议在子线程访问UI?

参考回答:
Android的UI控件不是线程安全的,如果在多线程中并发访问可能会导致UI控件处于不可预期的状态

这时你可能会问为何系统不对UI控件的访问加上锁机制呢?因为

  • 加锁机制会让UI访问逻辑变的复杂
  • 加锁机制会降低UI的访问效率,因为加锁会阻塞某些线程的执行

2019ハンドラの中間レベルのAndroid開発者のインタビューの回答

6.Looper死循环为什么不会导致应用卡死?

参考回答:

  • 主线程的主要方法就是消息循环,一旦退出消息循环,那么你的应用也就退出了,Looer.loop()方法可能会引起主线程的阻塞,但只要它的消息循环没有被阻塞,能一直处理事件就不会产生ANR异常。
  • 造成ANR的不是主线程阻塞,而是主线程的Looper消息处理过程发生了任务阻塞,无法响应手势操作,不能及时刷新UI。
  • 阻塞与程序无响应没有必然关系,虽然主线程在没有消息可处理的时候是阻塞的,但是只要保证有消息的时候能够立刻处理,程序是不会无响应的。

7.使用Handler的postDealy后消息队列会有什么变化?

参考答え:
このメッセージだけならば、そのメッセージはキューに送信されることはありませんが、時間を計算するときは、最初ルーパー、そこに目を覚ますために時間をブロックにウェイクアップします。しかし、この時点でタイムトリガによってソートされたヘッドインサート、最初のチームの最小時間、尾の最大時間に比べて長い遅延時間で新しいメッセージ、メッセージキューの先頭に参加する場合

8.新しい子スレッドハンドラは、それを指示することはできますか?方法は?

参考答え:

いいえ、メインスレッドので、内側アクティビティルーパーオブジェクトを含む、それが自動的にルーパー、子スレッドから送信されたメッセージの処理を管理します。子スレッドの場合は、任意のオブジェクトは、私たちはルーパーオブジェクトを維持するため、私たちは手動で維持する必要が全くありません。だから、ハンドラは、最初の子は、ルーパー、ルーパーとオープンループをスレッド作成オンにします

2019ハンドラの中間レベルのAndroid開発者のインタビューの回答

9.Messageはどのように作成することができますか?どちらが良い、なぜですか?

参考答え:次の3つの方法を作成することができます。

  • 直接生成メッセージm =新しいメッセージの例
  • 通过メッセージM = Message.obtain
  • 通过メッセージM = mHandler.obtainMessage()

メッセージプール内のメッセージの数がAndroidのデフォルトは10であるため、両方の良好後、後者の二つは、プール内のメッセージメッセージインスタンスを取るために、これは、複数のメッセージ・インスタンスの生成を避けることができています。

おすすめ

転載: blog.51cto.com/14332859/2415831