初学Handler有点疑惑
先上代码 说明一下问题
public class HandlerTextActivity extends Activity { //声明按钮变量 Button startButton,endButton; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); //获取按钮实例 startButton = (Button)findViewById(R.id.startButton); endButton = (Button)findViewById(R.id.endButton); //为按钮添加事件监听器 startButton.setOnClickListener(new startButtonClickListener()); endButton.setOnClickListener(new endButtonClickListener()); } Thread thread =null; Handler handler = new Handler(); class startButtonClickListener implements OnClickListener { @Override public void onClick(View v) { // handler.post(updateThread); thread = new Thread(updateThread); thread.start(); } } class endButtonClickListener implements OnClickListener { @Override public void onClick(View v) { flag = true; } } boolean flag=false; Runnable updateThread = new Runnable() { @Override public void run() { System.out.println("updateThread"); while(true) { System.out.println("updateThread"); try { Thread.sleep(1000); if(flag) { break; } } catch (InterruptedException e) { e.printStackTrace(); } } //handler.postDelayed(updateThread, 1000); } }; }
注意文中提到 When a process is created for your application, its main thread is dedicated to running a message queue that takes care of managing the top-level application objects (activities, broadcast receivers, etc) and any windows they create.
所以android的application实现方式就是通过 message queue来管理消息的,所以handler是android中最适合管理异步操作的方式。
[解决办法]
Handler 是一个连接线程(thread)与UI的一个桥梁,比如在Thread里面操作数据 要即时更新,你就要使用Handler 了。但是LZ也许会问,操作复杂的东西放在Handler不就可以了吗,我告诉你是不可以的,如果操作复杂而又耗时的操作放在Handler是会报ANR错误的,因为Handler是与系统UI在同一个线程里,因为UI不允许操作耗时的操作,所以handler也不允许有耗时的操作,否则就有ANR错误