2011-03-31 10 views
1

私のアプリケーションにプログレスバーを実装しようとしています。 このプログレスバーはボタンをクリックすると表示され、スレッドも一緒に開始されます。スレッドが完了すると、私はprogressBarを非表示にしようとしています。しかし、それは例外をキャッチしてexcuting:

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)を呼び出すことなく、このプログレスバーをキャンセルできますか?

は、あなたがUIスレッドからそれを呼び出す必要があります...

答えて

4

ありがとう:

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

別のアプローチは、AsyncTaskの代わりに、定期的なThreadを使用することです。

+0

ありがとうございます。 – Jomia

1

あなたはあなたがプログレスバーを非表示にするHandlerを使用することができ、実行可能な

static Handler handler = new Handler(); 
... 

handler.post(hideprogress); 


... 

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

でそれを呼び出す必要があり:

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アップデートを1か所に保存し、メンテナンスを容易にします。

関連する問題