Androidスレッドモード(handler,thread,looper)
3398 ワード
詳細
Androidフレームワークでは、1つのアプリケーション・パッケージには通常、同じプロセス(Process)で実行できる複数のJavaクラス(Class)が含まれています.同じプロセスで実行することもできます.
各プロセスが誕生すると、メインスレッド(Main Thread)が誕生し、LooperクラスのオブジェクトとMQ(Message Queue)資本構造が誕生します.メインコースが終わるたびに、Looper類を実行します.このとき,MQの動きを断続的に観察する.
メインスレッドの最も主要な仕事はUI画面のイベント(Event)であり、UIイベントが発生するたびにAndroidフレームワークはMQ裡に情報を失う.メインスレッドは,MQに新しい情報があるのを見たとき,情報を取り出し,情報の内容に基づいて特定の関数を実行する.実行が完了すると,引き続き実行Looper類を実行し,MQの動きを断続的に観察する.
本稿では,サブスレッドとプライマリスレッドとの間の通信を3つの例で説明する.
一:handlerによりメインスレッド内で通信する.
Objの値は「myLooper==MainLooper」です.このスレッドはメインスレッドに属するため、取得した現在のスレッドのLooperオブジェクトとメインスレッドのLooperオブジェクトは同一です.
二:サブスレッド送信message通知メインスレッド更新UI操作
Obj値はmyLooper is nullです.各プロセスが誕生すると、メインスレッド(Main Thread)が誕生し、LooperクラスのオブジェクトとMQ(Message Queue)アーキテクチャが誕生するからです.サブスレッドは、自分で作成しない限り自動的に作成されません.作成プロセスは例3を参照してください.
3:サブスレッドとプライマリスレッドの相互作用
サブスレッドに独自のLooperオブジェクトを作成する手順は、次のとおりです.
Looper.prepare();
自分の操作
Looper.loop();
HandlerThread .
このクラスは、looper変数が定義されているため、Threadを簡略化できます.
テストコードは添付ファイルを参照
以上の文章は高煥堂Androidシステムアーキテクチャを参考にして-Androidスレッドモデルの概要を詳しく説明した. Handler_Achieve.zip (10.8 KB) ダウンロード回数:23
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スレッドモデルの概要を詳しく説明した.