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

时间:2017-01-26 12:30:49

标签: java android multithreading ui-thread

我有一个在主要活动上绘制一条线的类,这条线用于设置数字。 (如果滑动改变了这一行的数字和长度。)

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

每个方法运行..但运行错误我想要每隔50ms更新UI(mainactivity中的imageview),但所有这些示例都更新了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();
}

每个方法运行..但运行错误我想要每隔50ms更新UI(mainactivity中的imageview),但所有这些示例都更新IF线程完成,所以我看不到动画我看到JUMP号码。这是不对的。

互联网告诉我可能会尝试

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

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

请你有一些想法如何解决我的问题谢谢

1 个答案:

答案 0 :(得分:0)

你试图以你的方式阻止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();
    }