java - 无法从另一个线程调用 constraintLayout.remove();

标签 java android multithreading

假设我有一个 ImageView,它在单击 Button 时执行:

 final ImageView ball = new ImageView(v.getContext());
 ball.setImageResource(R.drawable.ball_1);
 gameConstraintLayout.addView(ball);

当我点击那个按钮时,它首先让球出现,创建并运行另一个告诉自己 hibernate 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();
                    }

            });


        }
    });

问题是;

球出现在屏幕上,另一个线程成功 hibernate 了 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。

我什至尝试在 runOnUIThread(...) 的 UI 中运行那段代码,但无济于事。

这里是runONUIThread代码:

       shootTank.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(final View v) {
            final ImageView currentBullet = new ImageView(v.getContext());
            currentBullet.setImageResource(R.drawable.bullet_model1);
            gameConstraintLayout.addView(currentBullet);

            Thread thread = new Thread() {
                @Override
                public void run() {
                    try {
                        sleep(1000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }

                    runOnUiThread(new Runnable() {
                        public void run() {
                            gameConstraintLayout.removeView(currentBullet);
                        }
                    });


                }
            };
            thread.start();

        }
    });

任何可能的解决方案?请记住,我每秒都会更改球的 X 和 Y。

是的,我确实检查了其他问题。那些人的回答是简单地在 UI 线程上运行它,但我当然已经尝试过了。如果我在 UI 线程中运行 sleep(long millis),那么整个应用程序将是不负责任的。

(这不是完整的应用程序;它被分解成一个更简单易懂的问题。我最终在单独的线程中更改了球的 X 和 Y,但这就是导致问题的原因。如果需要编辑,请在评论中告诉我)

对小的语法错误表示抱歉

最佳答案

使用 handler 来执行你的 Action 有一些延迟。例如:

Handler h = new Handler();
h.postDelayed(new Runnable() {
   public void run() {
       gameConstraintLayout.removeView(currentBullet);
   }
}, 1000);  // here 1000 is delay in milliseconds (1sec)

关于java - 无法从另一个线程调用 constraintLayout.remove();,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52683812/

相关文章:

java - 线程中断

java - 在命令行参数中转义美元符号

java - Spring,@Aspect,@AfterThrowing,黑屏响应

java - JFrame 背景覆盖菜单栏

java - org.apache.commons.collections.ArrayStack 已经添加到输出中。请删除重复的副本

android - 如果有人反编译了你的安卓应用,他们能看到签名的证书吗?

java - 如何获取子文本并在 ListView 中设置它

android - Logcat 坏了。 eclipse 或终端没有输出

Java 线程 : Is it possible view/pause/kill a particular thread from a different java program running on the same JVM?

java - 线程锁和条件变量,生产者消费者示例