How to handle data output in an Observer?

I have an Observable and an Observer. The observable does download some stuff in a background thread and calls notifyObservers to let the observers read the status.

At some point in public void update the observer tries to updates the GUI


but it seems like the observable thread calls this method, because the Observable (!!!) throws this:

 android.view.ViewRoot$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.
 at android.view.ViewRoot.checkThread(
 at android.view.ViewRoot.requestLayout(
 at com.mynamespace.acitivty.TrackActivity.startPlay(
 at com.mynamespace.acitivty.TrackActivity.update(
 at java.util.Observable.notifyObservers(
 at java.util.Observable.notifyObservers(
 at com.mynamespace.module.communication.Download.stateChanged(

Is there some way I can prevent this from happening? I’m sure I’m missing something obvious here.


I think your issue is similar to this one: Android:android.view.ViewRoot$CalledFromWrongThreadException – How to solve the problem?

As bhatt4982 answers there, you can use Handler. From its doc:

“There are two main uses for a Handler: (1) to schedule messages and runnables to be executed as some point in the future; and (2) to enqueue an action to be performed on a different thread than your own.”.

The answer from AshtonBRSC is also good, you can enclose your UI update in a Runnable and use the runOnUiThread Activity’s method.

Leave a Reply

Your email address will not be published. Required fields are marked *