1、Handler的定义:数据库
主要接受子线程发送的数据, 并用此数据配合主线程更新UI。安全
解释:当应用程序启动时,Android首先会开启一个主线程 (也就是UI线程) , 主线程为管理界面中的UI控件, 进行事件分发, 好比说, 你要是点击一个 Button ,Android会分发事件到Button上,来响应你的操做。 若是此时须要一个耗时的操做,例如: 联网读取数据, 或者读取本地较大的一个文件的时候,你不能把这些操做放在主线程中,若是你放在主线程中的话,界面会出现假死现象, 若是5秒钟尚未完成的话,会收到Android系统的一个错误提示 "强制关闭"。 这个时候咱们须要把这些耗时的操做,放在一个子线程中,由于子线程涉及到UI更新,,Android主线程是线程不安全的, 也就是说,更新UI只能在主线程中更新,子线程中操做是危险的。 这个时候,Handler就出现了。,来解决这个复杂的问题 ,因为Handler运行在主线程中(UI线程中), 它与子线程能够经过Message对象来传递数据, 这个时候,Handler就承担着接受子线程传过来的(子线程用sedMessage()方法传弟)Message对象,(里面包含数据) , 把这些消息放入主线程队列中,配合主线程进行更新UI。ide
简单案例:点击按钮发起俩个线程this
首先定义两个子线程spa
1 private Runnable doinbackground;//子线程1 2 private Runnable doinbackground2;//子线程2 3 private Handler handler;
new出子线程1线程
1 doinbackground = new Runnable() { 2 3 @Override 4 public void run() { 5 // TODO Auto-generated method stub 6 Log.i("sub_Thread", "子线程1启动,id" 7 + Thread.currentThread().getId());
8 //1.访问数据库或者互联网,不在UI进程,因此不卡14 Message msg = new Message();
//对消息一个识别号,便于handler可以识别 15 msg.what = 1; 16 handler.sendMessage(msg); 17 Log.i("sub_Thread", "子线程1已经发送消息给handler"); 18 } 19 };
同理new 子线程2日志
1 doinbackground2 = new Runnable() { 2 3 @Override 4 public void run() { 5 // TODO Auto-generated method stub 6 Log.i("sub_Thread", "子线程2启动,id" 7 + Thread.currentThread().getId());14 Message msg = new Message(); 15 msg.what = 2; 16 handler.sendMessage(msg);20 Log.i("sub_Thread", "子线程2已经发送消息给handler"); 21 } 22 };
handler的代码code
1 handler = new Handler() { 2 3 @Override 4 public void handleMessage(Message msg) { 5 // TODO Auto-generated method stub 6 super.handleMessage(msg); 7 int id = msg.what; 8 Log.i("handler", "已经收到消息,消息what:" + id + ",id:" 9 + Thread.currentThread().getId()); 10 //这里是判断子线程是哪个,具体作什么操做(根据我的需求写) 11 /* if (id==1) { 12 tv.setText("子线程1的操做"+id); 13 } 14 if (id==2) { 15 adpter.notifyDataSetChanged(); 16 17 }*/ 18 } 19 };
最后在按钮的点击事件启动线程对象
1 btn = (Button) findViewById(R.id.button1); 2 btn.setOnClickListener(new OnClickListener() { 3 4 @Override 5 public void onClick(View v) { 6 /* 7 * MyTask mt=new MyTask(MainActivity.this); 8 * mt.execute(li,adpter); 9 */ 10 // TODO Auto-generated method stub 11 Thread th = new Thread(doinbackground); 12 th.start(); 13 Thread th2 = new Thread(doinbackground2); 14 th2.start(); 15 } 16 });
最后运行查看日志blog