ImageObserver is an interface that support asynchronous (non-blocking) image loading. This was probably originally to support applets, but in many cases it is a pain when you simply want synchronous (blocking) loading of images.
So if you use Component.createImage(URL) to get an Image, and then attempt to do something with it, for instance, image.getWidth(imageObserver) or Graphics.drawImage(image, x, y, imageObserver), Java may still be waiting for the image to load, so getWidth() will return -1 to tell you it doesn't yet know the width, and when the width *is* available the imageObserver will be called to tell it that it knows the width now.
I have rarely used ImageObservers for more than waiting for an image to load, and you can usually pass null as the ImageObserver if you don't care to be notified when the image is updated.