[转载]android多线程学习之handler – Jack Jia – 博客园.
在编写Android多线程程序时,进程间通信交换信息的一种方式就是使用handler,非常方便。
首先,在主线程里new一个Handler对象,并重写它的handleMessage(Message msg)方法,Message里有几个属性可以用来传递简单的int型参数,如what属性我们可以用来标记信息的种类(这在有N个线程N个 Message时非常有用,可以用老区分是哪个线程发送的什么消息),这时你可以定义几个static final int变量,用来给what分类;还有arg1和arg2两个属性可以用来存储int型消息内容,obj属性可以用来传递其他对象。
下面这个程序,我在新线程里做了一个循环,每隔一秒给主线程发送一个消息,每次传一个不同的int数据,在主线程里显示出来。
//thread_activity.java package com.jiadebin.android; import android.app.Activity; import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.util.Log; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.TextView; public class thread_activity extends Activity { private final static String TAG = "THREAD_ACTIVITY"; //调试标记 public final static int MUTI_THREAD = 0; //用于what属性的标记变量 public final static int COMPLETE_THREAD = 1; //用于what属性的标记变量 private Button btn; private TextView tv; private Handler handler = new Handler(){ @Override public void handleMessage(Message msg) { //重写处理消息的方法 // TODO Auto-generated method stub // Log.v(TAG, ""+msg.what); if(msg.what==MUTI_THREAD){ tv.setText(""+msg.arg1); } else if(msg.what==COMPLETE_THREAD){ tv.setText("complete"); btn.setText("complete"); } super.handleMessage(msg); } }; /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); tv = (TextView) findViewById(R.id.tv); btn = (Button)findViewById(R.id.btn); btn.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { // TODO Auto-generated method stub start_thread(); btn.setText("running..."); } }); } private void start_thread() { // TODO Auto-generated method stub new Thread(){ //新线程 @Override public void run() { // TODO Auto-generated method stub int i = 100; int j = 0; Message msg = new Message(); for(j=1;j<i;j++){ Log.v(TAG, "J = "+j); msg.what = MUTI_THREAD; msg.arg1 = j; handler.sendMessage(msg); //每次发送一个消息 try { Thread.sleep(1000); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } msg.what = COMPLETE_THREAD; handler.sendMessage(msg); //完成时,改变what属性 } }.start(); } } //main.xml <!--?xml version="1.0" encoding="utf-8"?--> <button></button>