スレッドでLooper.prepare()を呼び出してからLooper.loop()を呼び出すと、誰かがLooperでquit()を呼び出すまで、Threadが実行するのはMessageQueueを処理することだけです。
もう1つの注意点は、デフォルトでは、ハンドラーがインスタンス化されると、そのコードは作成されたスレッドで常に実行されるということです。
新しいスレッドを作成し、run()でLooper.prepare()を呼び出し、ハンドラーをセットアップしてから、Looper.loop()を呼び出す必要があります。
ここでこれらのことを念頭に置いて、私が多くの場所で使用する基本的なパターンです。また、代わりにAsyncTaskを使用する必要がある可能性があります。
public class NetworkThread extends Thread {
private Handler mHandler;
private Handler mCallback;
private int QUIT = 0;
private int DOWNLOAD_FILE = 1;
public NetworkThread(Handler onDownloaded) {
mCallback = onDownloaded;
}
public void run() {
Looper.prepare();
mHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
switch (msg.what) {
// things that this thread should do
case QUIT:
Looper.myLooper().quit();
break;
case DOWNLOAD_FILE:
// download the file
mCallback.sendMessage(/*result is ready*/);
}
}
}
Looper.loop();
}
public void stopWorking() {
// construct message to send to mHandler that causes it to call
// Looper.myLooper().quit
}
public void downloadFile(String url) {
// construct a message to send to mHandler that will cause it to
// download the file
}
}