例2会导致updateThread的run方法死循环,原因如下: 当i==100时,执行了下面几行代码 if (i == 100){ //将线程对象从队列中移除 updateBarHandler.removeCallbacks(updateThread); } 看似updateThread线程从线程对象队列中移除,不会再执行了,但是执行这几行代码前执行了下面代码 //将Message对象加入到消息队列当中 updateBarHandler.sendMessage(msg); 这会导致下面的代码被执行 public void handleMessage(Message msg) { progressBar.setProgress(msg.arg1); updateBarHandler.post(updateThread); //将要执行的线程放入到队列当中 } updateThread线程又加到线程对象队列中,updateThread线程永远不会从线程对象队列中移除,updateThread的run方法不断的执行,这就导致了死循环。 解决方案: 将 updateThread的run方法里的 if (i == 100){ //将线程对象从队列中移除 updateBarHandler.removeCallbacks(updateThread); } 这几行代码移到updateBarHandler的handleMessage方法里,修改如下: Handler updateBarHandler = new Handler(){ @Override public void handleMessage(Message msg) { progressBar.setProgress(msg.arg1); if(msg.arg1==100){ updateBarHandler.removeCallbacks(updateThread); }else{ updateBarHandler.post(updateThread); //将要执行的线程放入到队列当中 } } }; 我是通过调试查看代码的执行顺序,发现这个问题的
9 楼 2012-10-27
Handler主要是用于子线程与主线程的通讯,子线程可以把消息发送到主线程的Looper,有主线程来处理。
8 楼 2012-10-25
我觉得Handler大多用来作为线程池中的线程与主线程的通信工具!
7 楼 2011-11-25
回答三楼 不行,因为不能在子线程里更新UI
6 楼 2011-11-20
将 //如果i的值等于100 if (i == 100){ //将线程对象从队列中移除 updateBarHandler.removeCallbacks(updateThread); } 删了,写到如5楼写的那样就行了!!
5 楼 2011-09-28
不错,很全面,转了!
4 楼 2011-09-05
- if(msg.arg1>=progressBar.getMax())
- {
- System.out.println("removeCallbacks");
- updateBarHandler.removeCallbacks(updateThread);
- }
- else {
- System.out.println("updateBarHandler.post");
- updateBarHandler.post(updateThread); //将要执行的线程放入到队列当中
- }
3 楼 2011-03-24
请问直接在run方法里面增加进度条的进度不行吗,把i写成一个全局变量。
2 楼 2011-03-16
hehez 写道
- //使用匿名内部类来复写Handler当中的handlerMessage()方法
- Handler updateBarHandler = new Handler(){
- @Override
- public void handleMessage(Message msg) {
- progressBar.setProgress(msg.arg1);
- if(msg.arg1<=progressBar.getMax()) {
- updateBarHandler.removeCallbacks(updateThread);
- }else {
- updateBarHandler.post(updateThread); //将要执行的线程放入到队列当中
- }
- }
- };
1 楼 2011-03-04
- if (i == 100){
- //将线程对象从队列中移除
- updateBarHandler.removeCallbacks(updateThread);
- }
- //使用匿名内部类来复写Handler当中的handlerMessage()方法
- Handler updateBarHandler = new Handler(){
- @Override
- public void handleMessage(Message msg) {
- progressBar.setProgress(msg.arg1);
- updateBarHandler.post(updateThread); //将要执行的线程放入到队列当中
- }
- };
- //使用匿名内部类来复写Handler当中的handlerMessage()方法
- Handler updateBarHandler = new Handler(){
- @Override
- public void handleMessage(Message msg) {
- progressBar.setProgress(msg.arg1);
- if(msg.arg1<=progressBar.getMax()) {
- updateBarHandler.removeCallbacks(updateThread);
- }else {
- updateBarHandler.post(updateThread); //将要执行的线程放入到队列当中
- }
- }
- };