The simple fix to your example is:
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(r); } } 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