ContentObserver onChange
android, contentobserver
Solution
The `Thread` that the `ContentObserver.onChange()` method is executed on is the `ContentObserver` constructor's `Handler`'s `Looper`'s `Thead`.
For example, to have it run on the main UI thread, the code may look like this:
// returns the applications main looper (which runs on the application's
// main UI thread)
Looper looper = Looper.getMainLooper();
// creates the handler using the passed looper
Handler handler = new Handler(looper);
// creates the content observer which handles onChange on the UI thread
ContentObserver observer = new MyContentObserver(handler);
Alternatively, to have it run on a new worker thread, the code may look like this:
// creates and starts a new thread set up as a looper
HandlerThread thread = new HandlerThread("MyHandlerThread");
thread.start();
// creates the handler using the passed looper
Handler handler = new Handler(thread.getLooper());
// creates the content observer which handles onChange on a worker thread
ContentObserver observer = new MyContentObserver(handler);
Or even to have it run on the current thread, the code may look like this. Generally this is not what you want because a `Thread` that is looping can't do much else because `Looper.loop()` is a blocking call. Nevertheless:
// prepares the looper of the current thread
Looper.prepare();
// creates a handler for the current thread's looper.
Handler handler = new Handler();
// creates the content observer which handles onChange on this thread
ContentObserver observer = new MyContentObserver(handler);
// starts the current thread's looper (blocking call because it's
// looping, and handling messages forever). the content observer will
// only execute the onChange method while the thread is looping;
// interrupting Looper.loop() would "break" the content observer.
Looper.loop();
Problem
The documentation of the ContentObserver is not clear to me. On which thread is the onChange of a ContentObserver called? I checked and it is not the thread where you created the observer. It looks like it is the thread that sends the notification but I didn't find a documentation about it.