Androidスレッドモード(handler,thread,looper)


詳細
Androidフレームワークでは、1つのアプリケーション・パッケージには通常、同じプロセス(Process)で実行できる複数のJavaクラス(Class)が含まれています.同じプロセスで実行することもできます.
各プロセスが誕生すると、メインスレッド(Main Thread)が誕生し、LooperクラスのオブジェクトとMQ(Message Queue)資本構造が誕生します.メインコースが終わるたびに、Looper類を実行します.このとき,MQの動きを断続的に観察する.
メインスレッドの最も主要な仕事はUI画面のイベント(Event)であり、UIイベントが発生するたびにAndroidフレームワークはMQ裡に情報を失う.メインスレッドは,MQに新しい情報があるのを見たとき,情報を取り出し,情報の内容に基づいて特定の関数を実行する.実行が完了すると,引き続き実行Looper類を実行し,MQの動きを断続的に観察する.
本稿では,サブスレッドとプライマリスレッドとの間の通信を3つの例で説明する.
一:handlerによりメインスレッド内で通信する.
mBtn1.setOnClickListener(new OnClickListener() {
			@Override
			public void onClick(View v) {
				Looper myL = Looper.myLooper();
				Looper mainL = Looper.getMainLooper();
				String obj = "";
				mH = new MyHandler(mainL);
				if(myL == mainL) {
					obj = "myLooper == MainLooper";
				} else {
					obj = "myLooper != MainLooper";
				}
				Message msg = mH.obtainMessage(1, obj);
				mH.sendMessage(msg);
			}
		});

Objの値は「myLooper==MainLooper」です.このスレッドはメインスレッドに属するため、取得した現在のスレッドのLooperオブジェクトとメインスレッドのLooperオブジェクトは同一です.
二:サブスレッド送信message通知メインスレッド更新UI操作
mBtn1.setOnClickListener(new OnClickListener() {
			@Override
			public void onClick(View v) {
				mT = new MyThread();
				mT.start();
			}
		});

		public void run() {
			Looper myL = Looper.myLooper();
			Looper mainL = Looper.getMainLooper();
			String obj = "";
			mH = new MyHandler(mainL);
			if(myL == null) {
				obj = "myLooper is null";
			} else if(myL == mainL){
				obj = "myLooper == MainLooper";
			} else {
				obj = "myLooper != MainLooper";
			}
			Message msg = mH.obtainMessage(1, obj);
			mH.sendMessage(msg);
		}

Obj値はmyLooper is nullです.各プロセスが誕生すると、メインスレッド(Main Thread)が誕生し、LooperクラスのオブジェクトとMQ(Message Queue)アーキテクチャが誕生するからです.サブスレッドは、自分で作成しない限り自動的に作成されません.作成プロセスは例3を参照してください.
3:サブスレッドとプライマリスレッドの相互作用
mBtn1.setOnClickListener(new OnClickListener() {
			@Override
			public void onClick(View v) {
				String obj = "main thread";
				Message msg = mH.obtainMessage(1, obj);
				mH.sendMessage(msg);
			}
		});

		public void run() {
			Looper.prepare();
			mH = new Handler(){
				@Override
				public void handleMessage(Message msg) {
					Log.e("XXX", msg.obj.toString());
					Looper myL = Looper.myLooper();
					Looper mainL = Looper.getMainLooper();
					String obj = "";
					mH = new MyHandler(mainL);
					if(myL == mainL){
						obj = "myLooper == MainLooper";
					} else {
						obj = "myLooper != MainLooper";
					}
					Message msg1 = mH.obtainMessage(1, obj);
					mH.sendMessage(msg1);
				}
			};
			Looper.loop();
		}

サブスレッドに独自のLooperオブジェクトを作成する手順は、次のとおりです.
Looper.prepare();
自分の操作
Looper.loop();
HandlerThread .
このクラスは、looper変数が定義されているため、Threadを簡略化できます.
テストコードは添付ファイルを参照
以上の文章は高煥堂Androidシステムアーキテクチャを参考にして-Androidスレッドモデルの概要を詳しく説明した.
  • Handler_Achieve.zip (10.8 KB)
  • ダウンロード回数:23