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传递可序列化对象数据