Activity代码:
public class MainActivity extends Activity {
private MyThread myThread;
private Handler handler; //子线程与UI主线程进行消息通信
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
//通过Handler获取子线程推送过来的消息
handler = new Handler(){
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
Bundle bundle = msg.getData();
String value = bundle.getString("value");
outputEditText.setText(value);
}
};
//启动一个子线程
myThread = new MyThread(handler);
myThread.start();
showDialog("Socket Thread Started!");
}
/**
* 对话框显示
*/
private void showDialog(String msg){
new AlertDialog.Builder(this)
.setTitle("提示")
.setMessage(msg)
.setPositiveButton("ok", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
}
}).show();
}
}
Thread代码:
public class MyThread extends Thread{
private Handler handler;
public MyThread(Handler handler){
this.handler = handler;
}
@Override
public void run() {
try {
//持续向UI主线程发送当前日期时间
while(true){
TimeUnit.MILLISECONDS.sleep(1000);
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String date = sdf.format(new Date());
sendMessage(date);
}
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 向UI主线程发送消息
*/
private void sendMessage(String msg){
Bundle data = new Bundle();
data.putString("value", msg);
Message message = new Message();
message.setData(data);
this.handler.sendMessage(message);
}
}
需要刷新UI时的Handle实例化:
在主线程中: Handler handler = new Handler();
在其他线程中: Handler handler = new Handler(Looper.getMainLooper());
不用刷新UI时的Handle实例化:
在主线程中: Handler handler = new Handler();
在其他线程中:
Looper.prepare();
Handler handler = new Handler();
Looper.loop();
或者
Handler handler = new Handler(Looper.getMainLooper());
message.what一般用于区别消息的。进程内传递数据可用setData(Bundle),进程间要用message.obj传递可序列化对象数据