[Android/Android]Thread/Handler/Looper



キーワードの定理

  • プロセス:実行中のプログラムex)実行中のInstagram
  • プロセスは、(複数の)作業ユニット集合
  • である.
  • スレッド(Thread):最適化機能、ストレージ共有機能を含むプロセス内の独立した実行フローex.
  • プロセスは、メインスレッドのみ、またはメインスレッド+サブスレッドからなる
  • である.
  • バックグラウンドスレッドはUI要素
  • に直接アクセスできない.
  • バックグラウンドスレッドをプライマリスレッドに関連付けるのはHandler
  • である.

    Thread


    アンドロイドシステムは基本的にメインスレッドです.アンドロイドのスレッドは、①メインスレッドと②バックグラウンドスレッドに分けられます.プライマリ・スレッドは1つしか存在しません.バックグラウンド・スレッドは複数存在できます.

    1.メインスレッド(UIスレッド)

  • UIオペレーションは、プライマリスレッドに限定されます.
  • は、Android UIコンポーネントと対話し、UIイベントに応答するスレッドである.
  • UIイベントと操作に時間がかかると、AndroidシステムでANR(アプリケーション応答なし)エラーが発生します.
  • 2.バックグラウンドスレッド

  • バックグラウンドスレッドではUI操作はできません.
  • バックグラウンドスレッドは、処理時間を事前に計算できないタスクを処理することを推奨する.
  • バックグラウンドスレッドは、Threadクラスを継承するか、Runnableインタフェースを実装することによって生成することができる.
  • ->このようなマルチスレッド環境では,同期とスレッド間の通信を阻止するためにHandlerとRooperが用いられる.

    Handler


    Handler(Handler):受信したメッセージを処理し、スレッド間でメッセージを渡す
    ハンドラが作成された場合は、そのハンドラが作成されたねじとカーソルに接続されます.Handlerの利点は,postDelayedなどのメッセージの順序や送信時間を操作する関数を持つため,スケジューリングが可能であることである.

    Looper


    Looper(Looper):同じ操作を続行します.メッセージキューからメッセージとrunnableオブジェクトを順番に取り出し、プロセッサに渡します.
    1つのスレッドには1つのLooperしかありません.Looperは1つのスレッドだけを担当します.Looperはスレッド間の信号であり,handlerへの送信は直ちに処理されるものではない.複数のメッセージが同時に発生する可能性があるため、メッセージキューにスタックして処理します.キューの中の内容を一つ一つ取り出して処理します.これがルーパーです.プライマリ・スレッドにはlooperがあり、キューの内容を無限ループで処理します.

    使用例


    Androidは、メインスレッドで個々のスレッドの結果を処理するので、Main Looperを指定してHandlerを生成します.
    var handler: Handler? = null
    val thread = Thread {  
        handler = Handler(Looper.getMainLooper())
    }
    thread.start()
    PostDelayedを使用して2秒後に作業をスケジュールする例
    lateinit var runnable: Runnable
    var handler: Handler? = null
    
    handler = Handler(Looper.getMainLooper())
            runnable = Runnable {
               //UI작업
            }
            handler!!.postDelayed(runnable, 2000)