How to run a Runnable thread in Android at defined intervals?

后端 未结 11 1957
青春惊慌失措
青春惊慌失措 2020-11-22 02:50

I developed an application to display some text at defined intervals in the Android emulator screen. I am using the Handler class. Here is a snippet from my cod

相关标签:
11条回答
  • 2020-11-22 03:09

    For repeating task you can use

    new Timer().scheduleAtFixedRate(task, runAfterADelayForFirstTime, repeaingTimeInterval);
    

    call it like

    new Timer().scheduleAtFixedRate(new TimerTask() {
                @Override
                public void run() {
    
                }
            },500,1000);
    

    The above code will run first time after half second(500) and repeat itself after each second(1000)

    Where

    task being the method to be executed

    after the time to initial execution

    (interval the time for repeating the execution)

    Secondly

    And you can also use CountDownTimer if you want to execute a Task number of times.

        new CountDownTimer(40000, 1000) { //40000 milli seconds is total time, 1000 milli seconds is time interval
    
         public void onTick(long millisUntilFinished) {
          }
          public void onFinish() {
         }
        }.start();
    
    //Above codes run 40 times after each second
    

    And you can also do it with runnable. create a runnable method like

    Runnable runnable = new Runnable()
        {
            @Override
            public void run()
            {
    
            }
        };
    

    And call it in both these ways

    new Handler().postDelayed(runnable, 500 );//where 500 is delayMillis  // to work on mainThread
    

    OR

    new Thread(runnable).start();//to work in Background 
    
    0 讨论(0)
  • 2020-11-22 03:10

    Kotlin with Coroutines

    In Kotlin, using coroutines you can do the following:

    CoroutineScope(Dispatchers.Main).launch { // Main, because UI is changed
        ticker(delayMillis = 1000, initialDelayMillis = 1000).consumeEach {
            tv.append("Hello World")
        }
    }
    

    Try it out here!

    0 讨论(0)
  • 2020-11-22 03:14

    I believe for this typical case, i.e. to run something with a fixed interval, Timer is more appropriate. Here is a simple example:

    myTimer = new Timer();
    myTimer.schedule(new TimerTask() {          
    @Override
    public void run() {
        // If you want to modify a view in your Activity
        MyActivity.this.runOnUiThread(new Runnable()
            public void run(){
                tv.append("Hello World");
            });
        }
    }, 1000, 1000); // initial delay 1 second, interval 1 second
    

    Using Timer has few advantages:

    • Initial delay and the interval can be easily specified in the schedule function arguments
    • The timer can be stopped by simply calling myTimer.cancel()
    • If you want to have only one thread running, remember to call myTimer.cancel() before scheduling a new one (if myTimer is not null)
    0 讨论(0)
  • 2020-11-22 03:17
    new Handler().postDelayed(new Runnable() {
        public void run() {
            // do something...              
        }
    }, 100);
    
    0 讨论(0)
  • 2020-11-22 03:18

    An interesting example is you can continuously see a counter/stop-watch running in separate thread. Also showing GPS-Location. While main activity User Interface Thread is already there.

    Excerpt:

    try {    
        cnt++; scnt++;
        now=System.currentTimeMillis();
        r=rand.nextInt(6); r++;    
        loc=lm.getLastKnownLocation(best);    
    
        if(loc!=null) { 
            lat=loc.getLatitude();
            lng=loc.getLongitude(); 
        }    
    
        Thread.sleep(100); 
        handler.sendMessage(handler.obtainMessage());
    } catch (InterruptedException e) {   
        Toast.makeText(this, "Error="+e.toString(), Toast.LENGTH_LONG).show();
    }
    

    To look at code see here:

    Thread example displaying GPS Location and Current Time runnable alongside main-activity's User Interface Thread

    0 讨论(0)
  • 2020-11-22 03:20

    The simple fix to your example is :

    handler = new Handler();
    
    final Runnable r = new Runnable() {
        public void run() {
            tv.append("Hello World");
            handler.postDelayed(this, 1000);
        }
    };
    
    handler.postDelayed(r, 1000);
    

    Or we can use normal thread for example (with original Runner) :

    Thread thread = new Thread() {
        @Override
        public void run() {
            try {
                while(true) {
                    sleep(1000);
                    handler.post(this);
                }
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    };
    
    thread.start();
    

    You may consider your runnable object just as a command that can be sent to the message queue for execution, and handler as just a helper object used to send that command.

    More details are here http://developer.android.com/reference/android/os/Handler.html

    0 讨论(0)
提交回复
热议问题