0x29a
0x29a

Reputation: 773

Thread is blocking execution

I have a simple class which has a thread in it. Whenever user clicks on a button, I want to run the thread. Everything works great, except that whenever I click on the button while the thread is already running, my onTouch executes only after the thread has finished executing.

..
MyTouchAnimatorClass touchAnimatorClass = new MyTouchAnimatorClass();

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

And my class with the thread:

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;
    }
}

I can't understand why this is happening, isn't the Runnable running in its own thread? Any suggestions please? Thank you!

EDIT: I tried using

new Thread( r ).start();

Instead of:

r.run();

But unfortunately the same problem persists:

If I click the button the second time (while the thread is still running from the first click), it should execute onTouch, but shouldn't execute animate() since it is still running from the previous click.

What actually happens: The touch is non response until the thread from the first click has finished executing. Then onTouch triggers (even though I pressed it few seconds ago) and a new thread is started again.

If I press the button 10 times quickly, it will do 10 loops in a row, instead of doing one and blocking the others.

Upvotes: 0

Views: 67

Answers (2)

Rafael Lima
Rafael Lima

Reputation: 3535

Runnable isn't a thread, is just a set of instructions to be executed in a thread

in order to achieve what you want you need to do

new Thread(r).start(); at end of your code

Upvotes: 0

Teddy
Teddy

Reputation: 4223

activity.runOnUiThread is asking the Android system to run this Runnable on the UI thread.

You can rather do new Thread(r).start();

Like this:

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();


}

Upvotes: 3

Related Questions