为了账号安全,请及时绑定邮箱和手机立即绑定

不能从另一个线程调用constraintLayout.remove();

不能从另一个线程调用constraintLayout.remove();

缥缈止盈 2021-11-03 14:13:43
假设我有ImageView一个单击 a 即可执行的操作Button: final ImageView ball = new ImageView(v.getContext()); ball.setImageResource(R.drawable.ball_1); gameConstraintLayout.addView(ball);当我单击该按钮时,它首先使球出现,创建并运行另一个线程,告诉自己休眠 1000 毫秒,sleep(long millis)然后通过调用移除球ConstrainLayout.removeView(view)这是完整的最小代码:        final ImageView ball = new ImageView(v.getContext());        currentBullet.setImageResource(R.drawable.ball_1);        gameConstraintLayout.addView(ball);        ballAppears.setOnClickListener(new View.OnClickListener() {        @Override        public void onClick(final View v) {            final ImageView ball = new ImageView(v.getContext());            currentBullet.setImageResource(R.drawable.ball_1);            gameConstraintLayout.addView(ball);            Thread thread = new Thread() {                @Override                public void run() {                    try {                        sleep(1000);                        contraintLayout.removeView(ball)                    } catch (InterruptedException e) {                        e.printStackTrace();                    }            });        }    });问题是;球出现在屏幕上,另一个线程成功休眠了 1000 毫秒,但是,当它试图从另一个线程的约束布局中移除球时,它崩溃了。日志猫:    android.view.ViewRootImpl$CalledFromWrongThreadException: **Only the original thread that created a view hierarchy can touch its views**.  at  android.support.constraint.ConstraintLayout.removeView(ConstraintLayout.java:645)    at  com.mobilegames.***.******.GameActivity$1$1.run(GameActivity.java:51)导致问题的代码是:gameConstraintLayout.removeView(ball_1);看起来,我无法从另一个线程访问约束布局,但是,我仍然可以更改球的 X 和 Y。我什至尝试在 UI theard 中运行那段代码runOnUIThread(...),但无济于事。任何可能的解决方案?请记住,我每秒都会更改球的 X 和 Y。是的,我确实检查了其他问题。那些答案中说只是在 UI 线程上运行它,但当然我已经尝试过了。如果我将睡眠(长毫秒)运行到 UI 线程中,显然,整个应用程序将是不负责任的。(这不是完整的应用程序;它被分解为一个更简单易懂的问题。我最终在单独的线程中更改了球的 X 和 Y,但这就是导致问题的原因。请在评论中告诉我,如果需要编辑)抱歉小语法错误
查看完整描述

1 回答

?
ABOUTYOU

TA贡献1812条经验 获得超5个赞

使用处理程序延迟执行您的操作。例如:


Handler h = new Handler();

h.postDelayed(new Runnable() {

   public void run() {

       gameConstraintLayout.removeView(currentBullet);

   }

}, 1000);  // here 1000 is delay in milliseconds (1sec)


查看完整回答
反对 回复 2021-11-03
  • 1 回答
  • 0 关注
  • 115 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信