首先Handler是在主线程中定义的,然后在线程中可用使用这个Handler的变量来更新UI操作。也就是说,progressBar.setVisibility(View.VISIBLE);在点击的时候设置,然后是网络请求,网络请求是耗时操作,所以放在子线程中,这样不会阻塞主线程。但是子线程不能更新主线程的UI操作,所以有了Handler来帮忙。也就是说Handler在子线程里面调用,来通知主线程的UI更新操作。

解决方案 »

  1.   

    我的想法是这样的,在你访问网络取回JSON数据前执行下面代码,显示进度框
    private ProgressDialog pd;
    /**
     * 设置进度框
     */
    private void setProgressDialog(String str) {
    pd = new ProgressDialog(ConfirmActivity.this);
    pd.setMessage(str);
    // 设置对话框能用"取消"按钮关闭
    pd.setCancelable(false);
    // 设置对话框显示样式
    pd.setProgressStyle(ProgressDialog.STYLE_SPINNER);
    // 设置对话框的进度条显示
    pd.setIndeterminate(true);
    pd.show();
    }取回数据后,在Handler中再释放掉进度框
    private Handler handler = new Handler(){  
        @Override  
       public void handleMessage(Message msg) {            
                if(msg.what==0x123)
                {
                   pd.dismiss();
                }
       }};
      

  2.   

    使用异步操作吧,把网络数据部分放到异步里,在点击按钮事件里先调用processbar的操作,然后启动异步,就ok了
      

  3.   

    按钮点击事件是UI线程,显示progressbar也是UI线程,是这样么
      

  4.   

    连接网络 取数据应该在子线程执行 执行完后调用handler.sendEmptyMessage(0x456); 来通知主线程的界面改变
      

  5.   

    建议看下关于AsyncTask的详解,http://blog.csdn.net/liuyiming_/article/details/7462139