Android開発実践:メッセージループ付きワークスレッドをカスタマイズ
前の記事では、AndroidシステムのUIスレッドは、メッセージループ(Looper)メカニズムを持つスレッドであるとともに、Androidは、Handler()オブジェクトをバインドし、HandlerのsendMessage()関数を介してスレッドにメッセージを送信する、handleMessage()関数を介して、メッセージループ(Looper)をカプセル化したHandlerThreadクラスを提供しています.スレッドが受信したメッセージを処理します.抽象的に言えば,本稿では基礎的なJavaクラスライブラリを用いて,メッセージループ(Looper)付きスレッドを実現し,このようなLooperがどのように動作しているのかを初心者に理解させるのに役立つ.
1.まず、簡単なスレッドフレームワークを完成します.
上記コードに示すようにmLooperRunnable.run()ループはスレッドタスクを実行し,mIsLooperQuitはスレッドがループを終了する条件である.次に、メッセージの送信と処理コードを追加します.
2.スレッドループのメッセージ送信と処理コードの追加
(1)メッセージ構造体を定義し、メッセージキューを作成する
(2)反発ロックと条件変数の作成
(3)メッセージを送信する関数の作成
(4)メッセージを処理する関数の作成
(5)mLooperRunnable.run()ループにおける解析メッセージ
(6)スレッドのStop()関数を修正し,スリープメッセージループを起動する.
ここまで、基本的なメッセージループ付きスレッドクラスのパッケージが完了し、このコードを作成する過程から、システムがどのようにメッセージループを実現しているのかを理解すべきだと信じています.完全なコードは博文の最後の添付ファイルを見て、どんな疑問があって伝言あるいは手紙lujunを歓迎します[email protected]交流したり、私の新浪微博@ルー_に注目したりします.俊は最新の文章と情報を取得した.
1.まず、簡単なスレッドフレームワークを完成します.
public class LooperThread {
private volatile boolean mIsLooperQuit = false;
private Thread mThread;
public void start() {
if( mThread != null ) {
return;
}
mIsLooperQuit = false;
mThread = new Thread(mLooperRunnable);
mThread.start();
}
public void stop() {
if( mThread == null ) {
return;
}
mIsLooperQuit = true;
mThread = null;
}
protected Runnable mLooperRunnable = new Runnable() {
@Override
public void run() {
while( !mIsLooperQuit ) {
}
}
};
}
上記コードに示すようにmLooperRunnable.run()ループはスレッドタスクを実行し,mIsLooperQuitはスレッドがループを終了する条件である.次に、メッセージの送信と処理コードを追加します.
2.スレッドループのメッセージ送信と処理コードの追加
(1)メッセージ構造体を定義し、メッセージキューを作成する
public class LooperThread {
private Queue mMessageQueue = new LinkedList();
public static class Message {
int what;
}
}
(2)反発ロックと条件変数の作成
public class LooperThread {
private Lock mLock = new ReentrantLock();
private Condition mCondition = mLock.newCondition();
}
(3)メッセージを送信する関数の作成
// , ,
public void sendMessage( Message message ) {
if( mThread == null ) {
return;
}
mLock.lock();
mMessageQueue.add(message); //
mCondition.signal(); // , ,
mLock.unlock();
}
(4)メッセージを処理する関数の作成
// ,
public void handleMessage(Message message) {
// Callback
}
(5)mLooperRunnable.run()ループにおける解析メッセージ
protected Runnable mLooperRunnable = new Runnable() {
@Override
public void run() {
while( !mIsLooperQuit ) {
mLock.lock();
Message message = null;
try {
while( !mIsLooperQuit && mMessageQueue.isEmpty() ) {
mCondition.await(); //
}
message = mMessageQueue.poll();
}
catch (InterruptedException e) {
e.printStackTrace();
}
finally {
mLock.unlock();
}
handleMessage(message );
}
};
}
(6)スレッドのStop()関数を修正し,スリープメッセージループを起動する.
public void stop() {
if( mThread == null ) {
return;
}
mIsLooperQuit = true;
mLock.lock();
mCondition.signal();
mLock.unlock();
mMessageQueue.clear();
mThread = null;
}
ここまで、基本的なメッセージループ付きスレッドクラスのパッケージが完了し、このコードを作成する過程から、システムがどのようにメッセージループを実現しているのかを理解すべきだと信じています.完全なコードは博文の最後の添付ファイルを見て、どんな疑問があって伝言あるいは手紙lujunを歓迎します[email protected]交流したり、私の新浪微博@ルー_に注目したりします.俊は最新の文章と情報を取得した.