在Handler中设置TextView可见性时出错

时间:2012-02-05 07:19:56

标签: android

我一直在努力解决这个问题,而且我在stackoverflow上找到的其他解决方案都没有解决我的问题。

我的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可以解决问题,但事实并非如此。如果有人能够指出我哪里出错了,我会非常感激。

2 个答案:

答案 0 :(得分:0)

在此问题中,您似乎必须在修改后使文本视图“无效”。 help with Handler class to update UI - Android

通常ui动作不是从处理程序线程完成的,它们是由处理程序发布的runnable完成的。 runnable将在Activity线程中。看看这些建议是否有帮助,或让您走上正轨。

答案 1 :(得分: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;