Androidまじめに使えるようにしていこうということでメモがてら記録に残していく。
Handlerクラスはスレッド間でメッセージを受け渡すための仕組み
UIを管理するメインスレッドでは、内部的にLooper(メッセージキュー:別スレッドからのメッセージを管理して順に処理する)を持っている。
HandlerはLooperに対してメッセージ(以下の参考でいうRunnableオブジェクト)を送信するためのオブジェクト。
Handlerは別スレッドでnewすると上手く動かない。
public class MainActivity extends Activity {
private TextView txt;
private Handler handler = new Handler();
// 省略
Thread t = new Thread(new Runnable() {
@Override
publid void run() {
try {
// Http通信処理省略
final String body = EntitiyUtils.toString(res.getEntity(), "UTF-8");
handler.post(new Runnable() {
@Override
public void run() {
txt.setText(body)
})
} else //以下省略
SendMessage
メッセージの種類に応じて処理を分けたい場合はこっちのが良いかも
Messageのwhat, arg1, arg2, objあたりで処理を分岐する。
参考:Message | Android Developers
handler = object: Handler(Looper.getMainLooper()) {
override fun handleMessage(msg: Message) {
if (msg.what == 1) {
contentBinding.result.text = msg.obj.toString()
}
}
}
val msg = Message.obtain(handler, 1, "message 1") // 本来は通信結果をここに設定
handler.sendMessage(msg)