Android Handler之线程交互

来源:互联网 发布:长沙自考网络学校 编辑:程序博客网 时间:2024/04/27 21:47
通过前面的学习,我们知道如果在Activity中创建一个Handler = new Handler() ,如果不指定参数的的话,默认会绑定Main Thread的looper。 如果我们在创建的过程中,指定了某一个线程的looper,如new Handler(mHandlerThread.getLooper()) ,就会绑定另外一个线程的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~
0 0