diff options
-rwxr-xr-x | location/java/com/android/internal/location/GpsLocationProvider.java | 50 |
1 files changed, 37 insertions, 13 deletions
diff --git a/location/java/com/android/internal/location/GpsLocationProvider.java b/location/java/com/android/internal/location/GpsLocationProvider.java index 8dc206c..15d692c 100755 --- a/location/java/com/android/internal/location/GpsLocationProvider.java +++ b/location/java/com/android/internal/location/GpsLocationProvider.java @@ -63,13 +63,14 @@ import java.util.ArrayList; import java.util.Date; import java.util.Properties; import java.util.Map.Entry; +import java.util.concurrent.CountDownLatch; /** * A GPS implementation of LocationProvider used by LocationManager. * * {@hide} */ -public class GpsLocationProvider implements LocationProviderInterface, Runnable { +public class GpsLocationProvider implements LocationProviderInterface { private static final String TAG = "GpsLocationProvider"; @@ -190,7 +191,7 @@ public class GpsLocationProvider implements LocationProviderInterface, Runnable private static final int NO_FIX_TIMEOUT = 60; // true if we are enabled - private boolean mEnabled; + private volatile boolean mEnabled; // true if we have network connectivity private boolean mNetworkAvailable; @@ -236,7 +237,13 @@ public class GpsLocationProvider implements LocationProviderInterface, Runnable private Bundle mLocationExtras = new Bundle(); private ArrayList<Listener> mListeners = new ArrayList<Listener>(); + // GpsLocationProvider's handler thread + private final Thread mThread; + // Handler for processing events in mThread. private Handler mHandler; + // Used to signal when our main thread has initialized everything + private final CountDownLatch mInitializedLatch = new CountDownLatch(1); + // Thread for receiving events from the native code private Thread mEventThread; private String mAGpsApn; @@ -389,8 +396,17 @@ public class GpsLocationProvider implements LocationProviderInterface, Runnable Log.w(TAG, "Could not open GPS configuration file " + PROPERTIES_FILE); } - Thread thread = new Thread(null, this, "GpsLocationProvider"); - thread.start(); + // wait until we are fully initialized before returning + mThread = new GpsLocationProviderThread(); + mThread.start(); + while (true) { + try { + mInitializedLatch.await(); + break; + } catch (InterruptedException e) { + Thread.currentThread().interrupt(); + } + } } private void initialize() { @@ -673,7 +689,7 @@ public class GpsLocationProvider implements LocationProviderInterface, Runnable } private void handleDisable() { - if (DEBUG) Log.d(TAG, "handleEnable"); + if (DEBUG) Log.d(TAG, "handleDisable"); if (!mEnabled) return; mEnabled = false; @@ -1327,7 +1343,7 @@ public class GpsLocationProvider implements LocationProviderInterface, Runnable // native_wait_for_event() will callback to us via reportLocation(), reportStatus(), etc. // this is necessary because native code cannot call Java on a thread that the JVM does // not know about. - private class GpsEventThread extends Thread { + private final class GpsEventThread extends Thread { public GpsEventThread() { super("GpsEventThread"); @@ -1384,13 +1400,21 @@ public class GpsLocationProvider implements LocationProviderInterface, Runnable } }; - public void run() - { - Process.setThreadPriority(Process.THREAD_PRIORITY_BACKGROUND); - initialize(); - Looper.prepare(); - mHandler = new ProviderHandler(); - Looper.loop(); + private final class GpsLocationProviderThread extends Thread { + + public GpsLocationProviderThread() { + super("GpsLocationProvider"); + } + + public void run() { + Process.setThreadPriority(Process.THREAD_PRIORITY_BACKGROUND); + initialize(); + Looper.prepare(); + mHandler = new ProviderHandler(); + // signal when we are initialized and ready to go + mInitializedLatch.countDown(); + Looper.loop(); + } } // for GPS SV statistics |