【问题标题】:android : cancelling progressbar caught exception : android.view.ViewRoot$CalledFromWrongThreadExceptionandroid:取消进度条捕获异常:android.view.ViewRoot$CalledFromWrongThreadException
【发布时间】:2011-03-31 11:52:39
【问题描述】:

我正在尝试在我的应用程序中实现进度条。 此进度条在按钮单击时可见,然后一个线程也随之启动。当线程完成时,我试图使进度条不可见。但它在执行时遇到了异常:

progressbar.setVisibility(View.GONE);

例外:

android.view.ViewRoot$CalledFromWrongThreadException:只有创建视图层次结构的原始线程才能接触其视图。

我的代码是:

  Thread thredUpdate   = new Thread()
  {
     public void run()
     {
        ClearDatabase();
                 progressbar.setVisibility(View.GONE);                                      
     }
  };
  requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS);
  setProgressBarVisibility(true);
  ProgressBar progressbar  = (ProgressBar)findViewById(R.id.progress);
  progressbar .setVisibility(View.GONE);
  btnUpdateDB.setOnClickListener(new OnClickListener()
  {
      @Override
      public void onClick(View argBtnUpdateDB)
      {                 
            setProgressBarVisibility(true);
            progressbar.setVisibility(View.VISIBLE);
             try
            {
                     if((progressbar.isEnabled()))
                    thredUpdate.start();
             }               
            catch(Exception exSoap) 
            {                                                                                 
                   exSoap.printStackTrace();
            }

  } });

如何在不调用 setVisibility(View.GONE) 的情况下取消此进度条?

谢谢...

【问题讨论】:

    标签: android progress-bar


    【解决方案1】:

    你应该从 UI 线程调用它:

    runOnUiThread(new Runnable() {
            public void run() {
                 progressbar.setVisibility(View.GONE);
            }
        });
    

    另一种方法是使用AsyncTask 而不是常规的Thread

    【讨论】:

      【解决方案2】:

      你必须用一个可运行对象来调用它

      static Handler handler = new Handler();
      ...
      
      handler.post(hideprogress);
      
      
      ...
      
      static Runnable hideprogress = new Runnable()
          {
              @Override
              public void run() {
                  progressbar.setVisibility(View.GONE);
              }
          };
      

      【讨论】:

        【解决方案3】:

        您可以使用Handler 隐藏进度条:

        private static final int HANDLER_MESSAGE_UPDATE_COMPLETE = 0;
        
        Thread thredUpdate   = new Thread()
        {
            public void run()
            {
                ClearDatabase();
                    Message msg = Message.obtain();
                    msg.what = HANDLER_MESSAGE_UPDATE_COMPLETE;
                    myHandler.sendMessage(msg);                                          
            }
        };
        
        Handler myHandler = new Handler() {
            @Override
            public void handleMessage(Message msg) {
                switch(msg.what){
                case HANDLER_MESSAGE_UPDATE_COMPLETE:
                    progressbar.setVisibility(View.GONE);
                    break;
                default:
                    Log.w("MY_TAG","message type not supported: " + msg.what);
                }
            }
        };
        

        这种方法使您能够灵活地轻松添加新的消息类型以处理未来的变化。它还将您的所有 UI 更新保存在一个位置,以便于维护。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-02-23
          • 2011-06-09
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多