背景:点击界面上一个按钮,使文本框中的数字加1,此过程中,如果按钮点击事件是开启了一个新的线程,让文本框中的文字加1,则运算后的结果无法返回到主线程中,主线程拿不到修改后的值,无法更新文本框的内容,这时,使用Handler来进行线程间的数据传递
以下为DEMO
public class PostActivityActivity extends Activity {
private TextView numTV; int num; //负责线程间的通信,解决新线程修改了数据,但操作不到主线程里去更新的问题private Handler handler=new Handler(){
//msg是从按钮监听线程传过来的,是一个不断变化值的最新值,主线程在这里等待获取public void handleMessage(Message msg) {
// TODO Auto-generated method stub if(msg.what==1){ //传来的数据是被设置了类型的,所以要区分着拿int num=msg.getData().getInt("num");
numTV.setText(num+""); }
}
};
/** Called when the activity is first created. */@Override
//handler通信方式一:public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
numTV = (TextView) findViewById(R.id.numTV);
}
public void add1(View view){
new Thread(){public void run(){
//在新线程里发送一个runnable对象,则主线程就会执行该对象的run方法 疑问:运算过程还是在主线程中进行的,如何提高效率,等于白做???
handler.post(new Runnable() { @Override
public void run() {
//疑问:没有msg了怎么区分消息类型??? // TODO Auto-generated method stub //只有创建numTV的线程才能操作numTV numTV.setText(++num+""); }
});
}
}.start();
}
//handler通信方式二:开启新的线程来执行按钮上的监听方法,可以提高效率,解耦public void add2(View view){
new Thread(){public void run(){
//创建一个消息对象,该对象内部有一个存放数据的map集合 Message msg=new Message(); //通过消息对象.getData的形式,可以拿到对象内部的map集合,并可以放入一些数据 msg.getData().putInt("num", ++num); //把最新的数据通过handler发给创建handler的线程的线程, //那个线程就会自动执行handler类的handlerMessage方法 //发消息之前还可以给msg指定类型,以便在主线程中获取时可以区分的拿到消息msg.what=1;
handler.sendMessage(msg);
}
}.start();
}
}