线程正在阻止执行

时间:2018-11-18 13:29:23

标签: java android

我有一个简单的类,里面有一个线程。每当用户单击按钮时,我都想运行线程。一切工作正常,除了只要我在线程已运行时单击按钮,我的onTouch仅在线程完成执行后执行。

..
MyTouchAnimatorClass touchAnimatorClass = new MyTouchAnimatorClass();

view.setOnClickListener( new View.OnClickListener()
{
    @Override
    public void onClick( View view )
    {
        touchAnimatorClass.onTouch();
    }
});
..

我的课上有线程:

Class MyTouchAnimatorClass
{   
    private boolean threadRunning = false;

    public void onTouch() // <-- only executes AFTER the thread is complete
    {
        if( !threadRunning )
            animate();
    }

    private void animate()
    {
        threadRunning = true;

        Runnable r = new Runnable()
        {
            @Override
            public void run()
            {
                activity.runOnUiThread(new Runnable()
                {
                    @Override
                    public void run()
                    {
                        int i=0;
                        boolean doBreak = false;

                        while( true )
                        {
                            i+=1;

                            if( i == 100 )
                                break;
                        }
                    }
                }
            }
        }
        new Thread( r ).start();

        threadRunning = false;
    }
}

我不明白为什么会这样, Runnable 不是在自己的线程中运行吗?有什么建议吗?谢谢!

编辑: 我尝试使用

new Thread( r ).start();

代替:

r.run();

但不幸的是,同样的问题仍然存在:

如果我第二次单击该按钮(线程仍从第一次单击开始运行),则它应执行onTouch,但不应执行animate(),因为它仍从上次单击开始运行。

实际发生的情况:直到第一次单击的线程完成执行后,触摸才响应。然后onTouch触发(即使我是在几秒钟前按下的),然后再次启动新线程。

如果我快速按该按钮10次,它将连续执行10个循环,而不是一个循环并阻塞另一个循环。

2 个答案:

答案 0 :(得分:2)

activity.runOnUiThread要求Android系统在UI线程上运行此Runnable

您宁愿做new Thread(r).start();

赞:

private void animate()
{
    threadRunning = true;

    //Define the work as a Runnable
    Runnable r = new Runnable()
    {
        @Override
        public void run()
        {
                    int i=0;
                    //boolean doBreak = false; //Not used

                    while( true )
                    {
                        i+=1;

                        if( i == 100 )
                            break;
                    }
                    threadRunning = false; //Just before leaving
        }
    }

    //Give that work to a new thread and start the thread
    new Thread(r).run();


}

答案 1 :(得分:0)

Runnable不是线程,只是要在线程中执行的一组指令

为了实现您想要的目标

new Thread(r).start();在代码结尾