Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Run loop every second java

Tags:

java

android

int delay = 1000; // delay for 1 sec. 
int period = 10000; // repeat every 10 sec. 
Timer timer = new Timer(); 
timer.scheduleAtFixedRate(new TimerTask() 
    { 
        public void run() 
        { 
            displayData();  // display the data
        } 
    }, delay, period);  

And other:

while(needToDisplayData)
{
    displayData(); // display the data
    Thread.sleep(10000); // sleep for 10 seconds
}   

Both of them doesn't work (application is force closed). What other options I can try?

like image 690
good_evening Avatar asked Jul 27 '12 11:07

good_evening


3 Answers

You code is failed because you perform sleep in background thread but display data must be performed in UI thread.

You have to run displayData from runOnUiThread(Runnable) or define handler and send message to it.

for example:

(new Thread(new Runnable()
        {

            @Override
            public void run()
            {
                while (!Thread.interrupted())
                    try
                    {
                        Thread.sleep(1000);
                        runOnUiThread(new Runnable() // start actions in UI thread
                        {

                            @Override
                            public void run()
                            {
                                displayData(); // this action have to be in UI thread
                            }
                        });
                    }
                    catch (InterruptedException e)
                    {
                        // ooops
                    }
            }
        })).start(); // the while thread will start in BG thread
like image 134
dilix Avatar answered Nov 09 '22 18:11

dilix


Use onPostDelayed() accessed from any of your View or a Handler. You save memory by not creating a Timer or new Thread.

private final Handler mHandler = new Handler();

private final Runnable mUpdateUI = new Runnable() {
    public void run() {
        displayData();
        mHandler.postDelayed(mUpdateUI, 1000); // 1 second
        }
    }
};

mHandler.post(mUpdateUI);
like image 9
biegleux Avatar answered Nov 09 '22 18:11

biegleux


Try this :

@Override                    
    public void run() {   
            TextView tv1 = (TextView) findViewById(R.id.tv);
            while(true){
               showTime(tv1);                                                                
               try {
                   Thread.sleep(1000);
               }catch (Exception e) {
                   tv1.setText(e.toString());
               }           
            } 
    }       

U can also try this

There is an another way also that you can use to update the UI on specific time interval. Above two options are correct but depends on the situation you can use alternate ways to update the UI on specific time interval.

First declare one global varialbe for Handler to update the UI control from Thread, like below

Handler mHandler = new Handler(); Now create one Thread and use while loop to periodically perform the task using the sleep method of the thread.

new Thread(new Runnable() {
        @Override
        public void run() {
            // TODO Auto-generated method stub
            while (true) {
                try {
                    Thread.sleep(10000);
                    mHandler.post(new Runnable() {

                        @Override
                        public void run() {
                            // TODO Auto-generated method stub
                            // Write your code here to update the UI.
                        }
                    });
                } catch (Exception e) {
                    // TODO: handle exception
                }
            }
        }
    }).start();
like image 1
Goofy Avatar answered Nov 09 '22 18:11

Goofy