线程像方法一样工作(完成时更新)

Thread works like method (update when finish)

我有class在mainactivity上画一条线,这条线用来设置数字。 (如果滑动改变了这条线的数量和长度。)

所以现在我想在数字上设置线条时制作小动画。 例如,我首先打开 activity,然后在 6 号上设置 "line"。所以我想如果第二个打开 activity,我想在 6 号上设置 "line"。(我有这个)但是我想要小动画从 0 快速移动到 6。

每个方法运行..但是运行错了我想更新UI(main activity中的imageview)每50ms但是所有这个例子更新 IF 线程完成,所以我看不到动画我看到数字上的 JUMP。错了。

然后我写了这个代码//thread

 private void IntSkok(final int noci) {

   // int noci;                                  //how number I want set
    final int POCKROKOV=5;                       //steps between n and n+1
    final double[] hodnota = new double[1];      //how much px is one steps

    Thread timer = new Thread() { //new thread
        public void run() {
            Boolean b = true;
            try {
                do {
                    sleep(50);

                            while (hodnota[0] <(noci*34)) {

                                hodnota[0] = hodnota[0] + (34.0/POCKROKOV);
                                progresInt.prepisBol(hodnota[0]);   //this method set "line" on position I put int in px and thise method calculate number on this pozition and rewrite on mainactivity           
                                imgint=progresInt.Aktualizacia();  // this method is only imageview.invalidate();

                                try {
                                    Thread.sleep(50);
                                } catch (InterruptedException e) {
                                    e.printStackTrace();
                                }
                            }

                }
                while (b == true);
            } catch (InterruptedException e) {
                e.printStackTrace();
            } finally {
            }
        };
    };
    timer.start();
}

我把信息放在代码里

private void IntSkok(final int noci) {

   // int noci;
    final int POCKROKOV=5;
    final double[] hodnota = new double[1];

    Thread timer = new Thread() { //new thread
        public void run() {
            Boolean b = true;
            try {
                do {

                    sleep(50);

                    runOnUiThread(new Runnable() {
                        @Override
                        public void run() {
                            // TODO Auto-generated method stub

                            while (hodnota[0] <(noci*34)) {

                                hodnota[0] = hodnota[0] + (34.0/POCKROKOV);
                                progresInt.prepisBol(hodnota[0]);
                                imgint=progresInt.Aktualizacia();
                                try {
                                    Thread.sleep(50);
                                } catch (InterruptedException e) {
                                    e.printStackTrace();
                                }
                            }

                        }
                    });


                }
                while (b == true);
            } catch (InterruptedException e) {
                e.printStackTrace();
            } finally {
            }
        };
    };
    timer.start();
}

private void IntSkok2(final int noci){
    //int noci;
    final int POCKROKOV=5;
    final double[] hodnota = new double[1];
 Thread   thread = new Thread(){
        @Override
        public void run() {
            try {
                synchronized (this) {
                    wait(50);

                    runOnUiThread(new Runnable() {
                        @Override
                        public void run() {
                            while (hodnota[0] <(noci*34)) {

                                hodnota[0] = hodnota[0] + (34.0/POCKROKOV);
                                progresInt.prepisBol(hodnota[0]);
                                imgint=progresInt.Aktualizacia();
                                try {
                                    Thread.sleep(50);
                                } catch (InterruptedException e) {
                                    e.printStackTrace();
                                }
                            }
                        }
                    });

                }
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        };
    };
    thread.start();
}

每个方法运行..但是运行错了我想每50毫秒更新一次UI(main activity中的imageview)但是所有这些例子都更新IF线程完成,所以我看不到动画我看到数字上的 JUMP。这是错的。

网上告诉我可以试试

 runOnUiThread(new Runnable() {
                        @Override
                        public void run() {

但是这个工作比我的代码更错误,因为这会在完成线程时启动我的 activity。

请问你有什么办法解决我的问题谢谢

您正试图以您的方式阻止 ui 线程。当你想运行 OnUiThread 时,只需做一些与 UI.

相关的事情

我认为这个改变会奏效。

    Thread timer = null;
    private void IntSkok(final int noci) {

        // int noci; //how number I want set
        final int POCKROKOV = 5; // steps between n and n+1
        final double[] hodnota = new double[1]; // how much px is one steps
        timer = new Thread() { // new thread
            public void run() {
                Boolean b = true;
                try {
                    do {
                        sleep(50);
                        while (hodnota[0] < (noci * 34)) {
                            hodnota[0] = hodnota[0] + (34.0 / POCKROKOV);
                            runOnUiThread(new Runnable() {
                                @Override
                                public void run() {
                                    // TODO Auto-generated method stub
                                    progresInt.prepisBol(hodnota[0]);
                                    progresInt.Aktualizacia();
                                }

                            });
                            try {
                                Thread.sleep(50);
                            } catch (InterruptedException e) {
                                e.printStackTrace();
                            }

                        }

                    } while (b == true);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                } finally {
                }
            }
        };
        timer.start();
    }