Running code in main thread from another thread Running code in main thread from another thread multithreading multithreading

Running code in main thread from another thread


NOTE: This answer has gotten so much attention, that I need to update it. Since the original answer was posted, the comment from @dzeikei has gotten almost as much attention as the original answer. So here are 2 possible solutions:

1. If your background thread has a reference to a Context object:

Make sure that your background worker threads have access to a Context object (can be the Application context or the Service context). Then just do this in the background worker thread:

// Get a handler that can be used to post to the main threadHandler mainHandler = new Handler(context.getMainLooper());Runnable myRunnable = new Runnable() {    @Override     public void run() {....} // This is your code};mainHandler.post(myRunnable);

2. If your background thread does not have (or need) a Context object

(suggested by @dzeikei):

// Get a handler that can be used to post to the main threadHandler mainHandler = new Handler(Looper.getMainLooper());Runnable myRunnable = new Runnable() {    @Override     public void run() {....} // This is your code};mainHandler.post(myRunnable);


As a commenter below pointed correctly, this is not a general solution for services, only for threads launched from your activity (a service can be such a thread, but not all of those are).On the complicated topic of service-activity communication please read the whole Services section of the official doc - it is complex, so it would pay to understand the basics:http://developer.android.com/guide/components/services.html#Notifications

The method below may work in the simplest cases:

If I understand you correctly you need some code to be executed in the GUI thread of the application (cannot think about anything else called "main" thread).For this there is a method on Activity:

someActivity.runOnUiThread(new Runnable() {        @Override        public void run() {           //Your code to run in GUI thread here        }//public void run() {});

Doc: http://developer.android.com/reference/android/app/Activity.html#runOnUiThread%28java.lang.Runnable%29

Hope this is what you are looking for.


Kotlin versions

When you are on an activity, then use

runOnUiThread {    //code that runs in main}

When you have activity context, mContext then use

mContext.runOnUiThread {    //code that runs in main}

When you are in somewhere where no context available, then use

Handler(Looper.getMainLooper()).post {      //code that runs in main}