 <p>make it like this:</p> <pre><code> @Override public void run() { for (int i = 0; i &lt; 10000; i++) { if(i % 100) { mController.runOnUiThread(new Runnable() { public void run() { mController.triggered(i); } }); } try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } } } </code></pre> <p><strong>Explanation:</strong> you were previously changing an UI element from a Non-UI thread and this is not good. This code should work, BUT it is still not the recommended way to approach the problem. You should use something like a <a href="http://developer.android.com/reference/android/os/AsyncTask.html" rel="nofollow">AsyncTask</a> where you have a template method for 'background' operation (non-ui thread operation) and the 'onPostExecute' which <strong>already</strong> executes on the UI thread.</p> <p>another additional note: NEVER call <strong>Thread.sleep()</strong>; on the UI Thread (a.k.a. Main thread)</p>