Можно ли запустить команду в другом потоке внутри другого потока? - PullRequest
0 голосов
/ 02 апреля 2019

Поэтому я хочу проверить, находятся ли узлы в определенном диапазоне, и если да, нарисуйте их или нет. Узлы проверяются внутри таймера, поэтому создается поток. Единственная проблема, которая возникает сейчас, заключается в том, что метод 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);
    }

Ответы [ 2 ]

0 голосов
/ 02 апреля 2019

Хорошо, значит в 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);

    }
0 голосов
/ 02 апреля 2019
  • Создайте переменную в своем классе.
  • Установите значение при инициализации объекта или запишите установщик для этой переменной.
  • В функции выполнения проверьте условиес этой переменной и напишите бизнес-правила соответственно.
...