Long story:
AsyncTask
internally uses a Handler
. A handler basically allows you to post Runnables
from another thread on the thread the handler was assigned to, which in the case of AsyncTask
is always the thread from which it is called. This only works for threads that have a Looper
prepared, though.
For more information see http://developer.android.com/reference/android/os/Handler.html
Short story:
Simply wrap every call to FinderMain$1.gotLocation
or the creation of AsyncTask
within it in a Runnable
, and post it to a Handler
bound to the UI thread, like this:
class GetLastLocation extends TimerTask {
private Handler mHandler = new Handler(Looper.getMainLooper());
@Override
public void run() {
// ...
mHandler.post(new Runnable() {
public void run() {
locationResult.gotLocation(null);
}
});
// ...
}
}