2012-02-05 58 views
0

我一直在努力解決這個問題一段時間,而且我在stackoverflow上找到的其他解決方案都解決了我的問題。在處理程序中設置TextView可見性時出錯

我的UI線程的處理程序:

//Global declarations 
private UIHandler mHandler; 

class UIHandler extends Handler { 
    TextView actionTV, objectTV; 

    public UIHandler(TextView t1,TextView t2){ 
     actionTV = t1; 
     objectTV = t2; 
    } 

    @Override 
    public void handleMessage(Message msg) { 
     // a message is received; update UI text view 
     actionTV.setVisibility(View.VISIBLE); //Throws "CalledFromWrongThreadExc" 
     objectTV.setVisibility(View.VISIBLE); 
     System.out.println("Received Message"); 
    } 
} 

    //Inside of onCreate() 
    actionText = (TextView) findViewById(R.id.diceAction); 
    objectText = (TextView) findViewById(R.id.diceObject); 
    mHandler = new UIHandler(actionText,objectText); 

    //Inside of onClick 
    renderer.rollDice(mHandler); 
    actionText.setVisibility(View.GONE); 
    objectText.setVisibility(View.GONE); 

而且處理器從我的OpenGL渲染線程接收的消息。消息通過成功,正如我測試過的那樣。

我收到「action.setVisibility(View.VISIBLE)」行上的「CalledFromWrongThread」錯誤。我認爲將TextView傳遞給onCreate()中的Handler會解決問題,但它沒有。如果有人能指出我出錯的地方,我將不勝感激。

+0

我在OnCreate()中創建它,然後將其傳遞給rollDice()中的渲染器。 – 2012-02-05 20:48:55

回答

0

在這個問題中,看起來你必須在修改他們後使你的文章瀏覽無效。 help with Handler class to update UI - Android

另外通常ui操作不是通過處理程序線程完成的,而是通過處理程序發佈的可運行程序完成的。 runnable將在Activity線程中。看看這些建議是否有幫助,或讓你走上正軌。

0

我不知道這是否是最好的解決方法,但我通過在渲染器的線程中使用函數runOnUiThread(Runnable)來解決我的錯誤。在我發送消息之前,我現在只是稱之爲:

  //int flag = myRenderer.CALC_FINISHED; 
     mUIView.runOnUiThread(new Runnable() { 
      public void run() { 
       ((View) mUIView.findViewById(R.id.diceAction)).setVisibility(View.VISIBLE); 
       ((View) mUIView.findViewById(R.id.diceObject)).setVisibility(View.VISIBLE); 
       ((View) mUIView.findViewById(R.id.actionLock)).setClickable(true); 
       ((View) mUIView.findViewById(R.id.objectLock)).setClickable(true); 
      } 
     }); 
     //mHandler.dispatchMessage(Message.obtain(mHandler,flag)); 
     //mHandler = null; 
相關問題