我一直在努力解决这个问题,而且我在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可以解决问题,但事实并非如此。如果有人能够指出我哪里出错了,我会非常感激。
答案 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;