Android Handlerのスレッドインタラクション


前述の学習では,ActivityにHandler=new Handler()を作成し,パラメータを指定しないとMain Threadのlooperがデフォルトでバインドされることが分かった.作成中にnew Handler(mHandler Thread.getLooper()のようなスレッドのlooperを指定すると、別のスレッドのlooperがバインドされます.このように、この2つのHandlerを使用してスレッドのインタラクションを行うことができます.

    
    
    
    
package com.example.user.hanlder_02;
 
import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.HandlerThread;
import android.os.Message;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.TextView;
 
public class MainActivity extends Activity {
private static final int MSG_TO_THREAD = 0;
private static final int MSG_TO_MAIN_THREAD = 1;
private HandlerThread mHandlerThread;
private static Handler mUiHandler, mHandler;
private TextView mTextView;
 
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
init();
}
 
private void init() {
mTextView = (TextView) findViewById(R.id.tv);
// Main Thread Handler
mUiHandler = new Handler(){
@Override
public void handleMessage(Message msg) {
int what = msg.what;
if(MSG_TO_MAIN_THREAD == what){
Person person = (Person) msg.obj;
Log.d("david",Thread.currentThread() + " handle message @2");
mTextView.setText(person.toString());
}
}
};
 
mHandlerThread = new HandlerThread("MyHandlerThread");
mHandlerThread.start();
 
 // HandlerThread loopper handler
mHandler = new Handler(mHandlerThread.getLooper()){
@Override
public void handleMessage(Message msg) {
int what = msg.what;
if(MSG_TO_THREAD == what) {
Log.d("david", Thread.currentThread() + " handle message @1");
Message message = mUiHandler.obtainMessage();
Person person = new Person("David",24);
message.obj = person;
message.what = MSG_TO_MAIN_THREAD;
// , MainThread
mUiHandler.sendMessage(message);
}
}
};
}
 
@Override
protected void onResume() {
super.onResume();
Message msg = mHandler.obtainMessage();
msg.what = MSG_TO_THREAD;
// ,
mHandler.sendMessage(msg);
}
 
class Person{
public String name;
public int age;
 
public Person(String name, int age){
this.name = name;
this.age = age;
}
@Override
public String toString() {
return "Name = " + name + " ,Age = " + age;
}
}
}

onResumeメソッドでは、mHandlerを利用してHandlerThreadにメッセージを送信しています.ここでは、HandlerThreadに時間のかかる操作をさせることができます.時間のかかる操作が完了すると、Main Threadにメッセージを送信することができます.このとき、Main ThreadにバインドされたmUIHandlerを利用してメッセージを送信することができます.具体的には、コードを見てください.基本的にはあまり言えませんが、前のいくつかの文章ではよく説明しています.
これでHandler解析は完了し、nice or not~