Androidスレッドの概要


アプリケーションが起動されると、メインスレッドと呼ばれるスレッドが作成されます.このスレッドは非常に重要で、その役割は主に以下の2つの点があります:1、イベントをペイントすることを含む対応するUIコンポーネントにイベントを配布することを担当します.2.アプリケーションとUIとの相互作用を担当し、これらのUIはandroidである.ウィットとアンドロイドviewパッケージのコンポーネント.
要するに、イベントの配布とインタラクションを担当し、ユーザインタフェースUIコンポーネントと密接に関連しているため、プライマリスレッドはUIスレッドとも呼ばれる.
同じプロセスで実行されるすべてのコンポーネントはUIスレッドでインスタンス化され、各コンポーネントに対するシステムの呼び出しもこのスレッドから配布され、システムのコールバック方法もこのスレッドで実行されます.
例えば、ユーザが画面上のButtonをクリックすると、UIスレッドはこのクリックイベントをButtonに配信し、このButtonはこのイベントを受信するとクリック状態を設定し、再描画要求メッセージをイベントキューに送信し、UIスレッドは、この要求メッセージをデバイスキューから取り出し、Buttonに再描画を通知する.
ネットワーク操作やデータベース操作などの時間のかかる操作を含むUIスレッドのすべての操作がUIスレッドに含まれている場合、UIスレッドはブロック状態にある可能性が高く、スレッドがブロックされている場合、ペイントイベントを含むイベントが配布されず、UIスレッドが5秒以上ブロックされている場合、応答のないANRダイアログボックスがポップアップされます.
UIコンポーネントはスレッドセキュリティではないため、UIスレッド以外のスレッドではUIを操作することはできません.つまり、すべての操作はUIスレッドで完了する必要があります.
Androidのこのような単一スレッドモデルでは、1、UIスレッドをブロックしない2、UIスレッドでUI操作を行う必要がある2つのルールがあります.
以上から分かるように、UIスレッドには時間のかかる操作は絶対に置かないでください.次のように、非同期の操作のためにスレッドを単独で起動することができます.
public void onClick(View v) {
    new Thread(new Runnable() {
        public void run() {
            Bitmap b = loadImageFromNetwork("http://example.com/image.png");
            mImageView.setImageBitmap(b);
        }
    }).start();
}
上記のコードはルール1を満たしているが、ImageViewの操作はUI操作に属するため、ルール2に違反している.
では、私たちはどうすればいいのでしょうか.次の3つの方法があります.
Activity.runOnUiThread(Runnable)
View.post(Runnable)
View.postDelayed(Runnable, long)
次に、上記の例を改善します.
public void onClick(View v) {
    new Thread(new Runnable() {
        public void run() {
            final Bitmap bitmap =
                    loadImageFromNetwork("http://example.com/image.png");
            mImageView.post(new Runnable() {
                public void run() {
                    mImageView.setImageBitmap(bitmap);
                }
            });
        }
    }).start();
}
さらに、UIの更新やバックグラウンドの時間のかかる操作の処理を含むパッケージ化されたクラスAsyncTaskを使用することもできます.具体的には、AndroidのAsyncTaskソースコード解析を参照してください.
参考記事:Processes and Threads