在学handler的时候遇到了一个问题,我还是直接贴代码吧,出错的地方就是在注释的几行class MyHandler extends Handler {
     public MyHandler() {
    
     }
     public MyHandler(Looper looper) {
     super(looper);
     }
     @Override
public void handleMessage(Message msg) {
// TODO Auto-generated method stub

bar.setProgress(msg.arg1);
if(msg.arg1 != 100) {
mh.post(myThread);
} else {
//下面3行会导致程序报错
// startBtn.setEnabled(true);
// bar.setVisibility(View.GONE);
// Toast.makeText(HandlerDemo.this, "完成", Toast.LENGTH_SHORT).show();
     mh.removeCallbacks(myThread);
}

}
    }这个小程序就是点击按钮之后启动一个线程,然后让进度条步进,到100的时候用Toast提示
我在oncreate里new了一个HandlerThread对象然后把对象的looper传给这个MyHandler的内部类,但是运行到ProgressBar到100的时候会出错谁能告诉我一下原因??

解决方案 »

  1.   

    如果有错的话,就这行了,Toast.makeText(HandlerDemo.this, "完成", Toast.LENGTH_SHORT).show();应该改为Toast.makeText(MyHandler.this, "完成", Toast.LENGTH_SHORT).show();
      

  2.   

    不是的,HandlerDemo.this我的那个Activity的名字就是HandlerDemo,MyHandler只是这个Activity的一个内部类,不是这的错误,因为前面两行也会报错
      

  3.   

    只有主线程才能来绘制画面,其他线程去操作UI时会异常,解决方法
    可以在主线程定义handler hui;
    当进度条到100时子线程通过hui.sendMessage叫主线程去更新,而不是子线程直接操作UI。
      

  4.   

    up
    只有主线程,也就是UI线程才能更新UI(View)。
      

  5.   

    上面的兄弟说的不错,只有UI线程可以绘图,new Thread()
    会出错,我也翻过这个错误,或者用异步处理来解决。
    AsychronizedTask 你可以看看sdk.
     
      

  6.   


    正确,handler要把消息通知到主线程,由主更新UI
      

  7.   

    顶个,lz的代码小于100的时候用handler处理,到了100又直接整,不符合逻辑啊
      

  8.   

    handler机制原理,我写了一个blog比较详细,大家可以看看
    http://blog.csdn.net/stonecao/archive/2011/05/13/6417364.aspx