2012-02-05 36 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; 
相关问题