【问题标题】:Is it possible to run command on different thread inside other thread?是否可以在其他线程内的不同线程上运行命令?
【发布时间】:2019-04-02 13:16:10
【问题描述】:

所以我想检查节点是否在特定范围内,如果是,则绘制它们。 在计时器内检查节点,因此创建了一个线程。现在唯一的问题是必须从 UI 线程调用方法 setRenderable()。那么有没有办法绕过呢?我需要这个在一定的时间间隔内更新,这就是我创建计时器的原因。

 public void updateNodes()
    {
        Camera camera = arFragment.getArSceneView().getScene().getCamera();

        timer = new Timer();
        timer.schedule(new TimerTask(){
            int last = 0;
            int copy_last = 0;
            @Override
            public void run(){
                Vector3 camera_position = camera.getWorldPosition();
                // We're checking all nodes for distance between them
                for(Node al : copied_nodes_list){
                    if(last<copy_last) last++;
                    else if(countDistanceOfNodes(al,camera_position)<3.0 && copy_last >= last) {
                        al.setRenderable(andyRenderable);
                        last++;
                        copy_last = last;
                    }
                    else {
                            al.setRenderable(andyRenderable);   
                    }
                }
                last = 0;

            }
        },0,250);
    }

【问题讨论】:

  • GUI 框架是否没有自己的“Timer”类在 GUI 线程上“触发”定时事件? (例如,Swing 框架有javax.swing.Timer
  • 我正在使用谷歌的 ARCore,我找不到任何表现得像计时器的方法。这是文档。 developers.google.com/ar/reference/java/sceneform/reference/com/…
  • @SolomonSlow 我发现有一个名为 runOnUiThread() 的 android 方法。你认为这能解决这个案子吗?唯一的问题是我必须传递一个可运行的,而不是计时器。
  • 几乎一样好:这意味着你需要两个Runnables;让第一个被计时器调用,然后让它将第二个提交给runOnUiThread()

标签: java multithreading arcore ui-thread


【解决方案1】:
  • 在您的类中创建一个变量。
  • 在初始化对象时设置值或针对该变量编写设置器。
  • 在 run 函数中,对照该变量检查条件并相应地编写业务规则。

【讨论】:

  • 我不太明白。这将如何帮助我使用 setRenderable()?你能解释一下吗?
  • @DanyalSandeelo,大多数 GUI 框架都是“单线程的”,这意味着只有一个可区分的线程(称为“GUI 线程”、“事件线程”、“主线程”等)是允许调用任何框架方法。其他线程通常不允许调用任何 GUI 函数,除非将事件发布到队列。
【解决方案2】:

好的,Android 中有一个叫做 runOnUiThread(); 的函数。基本上就是在做所谓的事情。我附上工作代码。

public void updateNodes()
    {
        Camera camera = arFragment.getArSceneView().getScene().getCamera();
        Timer timer = new Timer();
        timer.schedule(new TimerTask(){
            int last = 0;
            int copy_last = 0;
            @Override
            public void run(){
                Vector3 camera_position = camera.getWorldPosition();

                // We're checking all nodes for distance between them
                for(Node al : copied_nodes_list){
                    camera_position = camera.getWorldPosition();

                    if(last<copy_last) last++;

                    else if(countDistanceOfNodes(al,camera_position)<3.0 && copy_last >= last) {
                        runOnUiThread(new Runnable(){
                            @Override
                            public void run(){
                                al.setRenderable(andyRenderable);
                            }
                        });
                        last++;
                        copy_last = last;
                    }
                    else {
                            runOnUiThread(new Runnable(){
                                @Override
                                public void run(){
                                    al.setRenderable(null);
                                }
                            });

                    }
                }
                last = 0;
            }
        },0,100);

    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-02-16
    • 2017-02-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-10
    相关资源
    最近更新 更多